Tessovis 文档
官网 ↗ 演示 ↗

OSDK

SDK 不是手写的,是从本体生成的。模型接口与结果行随本体重新生成;服务端函数里的查询面全类型,deno check 在编译期抓出属性拼写错误。

生成与安装

注册 SDK 应用(选定对象/行动/函数白名单),每次本体变更后调 regenerate 重新生成。包经实例内置的私有 registry 分发;registry 以组织作用域 PAT 鉴权(无组织作用域的令牌会收到 422 ORG_SCOPE_REQUIRED):

# 签发组织作用域 PAT(服务账号 + scopes.org;$TOKEN 为你的登录令牌)
$ SVC=$(curl -s -X POST https://<实例>/v1/service-accounts \
    -H "authorization: Bearer $TOKEN" -H 'content-type: application/json' \
    -d '{"name":"osdk-registry"}' \
    | node -pe 'JSON.parse(require("fs").readFileSync(0,"utf8")).id')
$ PAT=$(curl -s -X POST https://<实例>/v1/tokens \
    -H "authorization: Bearer $TOKEN" -H 'content-type: application/json' \
    -d "{\"userId\":\"$SVC\",\"name\":\"registry\",
         \"scopes\":{\"org\":\"<组织>\"},\"expiresInDays\":90}" \
    | node -pe 'JSON.parse(require("fs").readFileSync(0,"utf8")).token')

# 注册 SDK 应用(控制台「管理 → SDK 应用」可查看清单)
$ curl -X POST https://<实例>/v1/sdk/apps -H "authorization: Bearer $TOKEN" \
    -H 'content-type: application/json' \
    -d '{"orgSlug":"<组织>","name":"<应用名>",
         "objectTypes":["part"],"actions":["restock"],"functions":[]}'

# TypeScript(npm 兼容 registry;组织作用域 PAT 即令牌)
$ npm config set @tesso:registry https://<实例>/v1/registry/npm/
$ npm config set //<实例>/v1/registry/npm/:_authToken <PAT>
$ npm install @tesso/osdk-<应用名>

# Python(PEP 503 simple registry;Basic 凭据带 PAT)
$ pip install --index-url https://token:<PAT>@<实例>/v1/registry/pypi/simple/ \
    tesso-osdk-<应用名>

# React 应用脚手架(生成工程内含 vendored hooks 与已配好的客户端)
$ tesso create app <应用名> --org <组织> --token <scoped-token>

TypeScript 查询面

import { client } from "./tesso";

// 对象集:where 过滤 → fetch 取数(结果行是生成的模型接口,全类型)
const low = await client.objects.part
  .where({ qty: { lt: 25 } })
  .fetch({ pageSize: 100, sort: [{ prop: "qty", dir: "asc" }] });

const byRegion = await client.objects.supplier.aggregate({
  metrics: [{ agg: "count" }],
  groupBy: ["region"],
});

比较子封闭清单:eq / neq / gt / gte / lt / lte / in / contains / startsWith / isNull。应用侧 OSDK 的模型接口与结果行全类型(where 子句宽松);服务端函数 SDK 连 where 子句与属性名一并全类型。权限内联在查询里——你看不见的对象不会出现在结果与计数中。

写入走行动

OSDK 不提供裸写接口。所有写入经行动(Action)管线:校验、权限、审计、可回滚,一个不少。

// React:useAction 返回 TanStack Query mutation;默认进人工审核队列的行动
// 会如实返回 staged 态。hooks 由脚手架 vendored 到 src/vendor/tesso-react.ts。
import { useAction } from "./vendor/tesso-react";

const restock = useAction(client, "restock");
await restock.mutateAsync({ target: "P-1003" });

React hooks

hook用途
useObjects对象集查询(分页、排序、where)
useObject单对象读取
useLinks沿链接取对端对象
useAction行动提交(含审核态回传)
useSubscriptionSSE 实时订阅(他人编辑即时可见)

函数运行时同一套类型

服务端函数跑在 Deno 沙箱(默认全拒绝,仅允许回调网关),函数内的 objects.*.where().fetch() 与前端 OSDK 是同一套生成类型。tesso fn dev 拉取 sdk.ts 后,deno check 在编译期抓出属性拼写错误。

$ tesso fn dev
拉取 /v1/functions/<org>/sdk.ts → 本地全类型提示

REST 与 OpenAPI

全部 HTTP 面有 OpenAPI 描述:GET /v1/openapi.json。查询函数可发布为带版本的 REST API(/v1/functions/:org/:name/invoke/:version),以 scoped PAT 鉴权。