@unidocs/operator-cloudflare 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-credential.d.ts +27 -0
- package/dist/agent-credential.d.ts.map +1 -0
- package/dist/agent-credential.js +25 -0
- package/dist/agent-credential.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/session.d.ts +17 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +3 -1
- package/dist/session.js.map +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operator 这一侧的 Agent API 凭据。
|
|
3
|
+
*
|
|
4
|
+
* **单独一个文件,不在 session.ts 里**:那个文件 import `cloudflare:workers`
|
|
5
|
+
* 拿 DurableObject,于是在 workerd 之外加载不了 —— 把这段挑出来,它就能被普通的
|
|
6
|
+
* 单元测试直接覆盖,而这是整条链上唯一需要「选对了哪一种」的判断。
|
|
7
|
+
*/
|
|
8
|
+
import type { AgentCredential } from "@unidocs/agent-operator-core";
|
|
9
|
+
/** 只取这几项,所以调用方传 env 的哪个超集都行。 */
|
|
10
|
+
export interface AgentCredentialEnv {
|
|
11
|
+
readonly OPERATOR_SIGNING_KEY?: string;
|
|
12
|
+
readonly OPERATOR_HMAC_KEY?: string;
|
|
13
|
+
readonly OPERATOR_AGENT_TOKEN?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 这个 Operator 怎么向 Platform 证明自己是谁。
|
|
17
|
+
*
|
|
18
|
+
* 优先级即迁移方向:有自己的私钥就签断言(没有任何共享值,Portal 侧零 secret 写入);
|
|
19
|
+
* 没有密钥对的用同一把 webhook 共享密钥签,同样不新增凭据;两者都没有才退回 0.5.0
|
|
20
|
+
* 之前那枚共享口令。
|
|
21
|
+
*
|
|
22
|
+
* **三样都没有就当场抛,而不是带着一个空凭据出发** —— 那样的表现是每一次 Agent API
|
|
23
|
+
* 调用 401,而「上报失败」本身也走那条通道,于是整轮停住、既不结束也不报错(坑 9)。
|
|
24
|
+
* 在构造处抛出来,至少错误会落进 Operator 自己的日志。
|
|
25
|
+
*/
|
|
26
|
+
export declare function agentCredential(env: AgentCredentialEnv, declaredOperatorId: string): Promise<AgentCredential>;
|
|
27
|
+
//# sourceMappingURL=agent-credential.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-credential.d.ts","sourceRoot":"","sources":["../src/agent-credential.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAGpE,gCAAgC;AAChC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACxC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CASnH"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { importOperatorSigningKey } from "@unidocs/service-auth";
|
|
2
|
+
/**
|
|
3
|
+
* 这个 Operator 怎么向 Platform 证明自己是谁。
|
|
4
|
+
*
|
|
5
|
+
* 优先级即迁移方向:有自己的私钥就签断言(没有任何共享值,Portal 侧零 secret 写入);
|
|
6
|
+
* 没有密钥对的用同一把 webhook 共享密钥签,同样不新增凭据;两者都没有才退回 0.5.0
|
|
7
|
+
* 之前那枚共享口令。
|
|
8
|
+
*
|
|
9
|
+
* **三样都没有就当场抛,而不是带着一个空凭据出发** —— 那样的表现是每一次 Agent API
|
|
10
|
+
* 调用 401,而「上报失败」本身也走那条通道,于是整轮停住、既不结束也不报错(坑 9)。
|
|
11
|
+
* 在构造处抛出来,至少错误会落进 Operator 自己的日志。
|
|
12
|
+
*/
|
|
13
|
+
export async function agentCredential(env, declaredOperatorId) {
|
|
14
|
+
const signingKey = await importOperatorSigningKey(env.OPERATOR_SIGNING_KEY);
|
|
15
|
+
if (signingKey)
|
|
16
|
+
return { kind: "assertion", declaredOperatorId, key: signingKey };
|
|
17
|
+
const hmac = env.OPERATOR_HMAC_KEY;
|
|
18
|
+
if (typeof hmac === "string" && /^[0-9a-f]{64}$/.test(hmac)) {
|
|
19
|
+
return { kind: "assertion", declaredOperatorId, key: Uint8Array.from(hmac.match(/../g) ?? [], pair => Number.parseInt(pair, 16)) };
|
|
20
|
+
}
|
|
21
|
+
if (env.OPERATOR_AGENT_TOKEN)
|
|
22
|
+
return { kind: "bearer", token: env.OPERATOR_AGENT_TOKEN };
|
|
23
|
+
throw new Error("No Agent API credential: set OPERATOR_SIGNING_KEY (preferred), OPERATOR_HMAC_KEY, or OPERATOR_AGENT_TOKEN");
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=agent-credential.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-credential.js","sourceRoot":"","sources":["../src/agent-credential.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AASjE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAuB,EAAE,kBAA0B;IACvF,MAAM,UAAU,GAAG,MAAM,wBAAwB,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC5E,IAAI,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;IAClF,MAAM,IAAI,GAAG,GAAG,CAAC,iBAAiB,CAAC;IACnC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;IACrI,CAAC;IACD,IAAI,GAAG,CAAC,oBAAoB;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,oBAAoB,EAAE,CAAC;IACzF,MAAM,IAAI,KAAK,CAAC,2GAA2G,CAAC,CAAC;AAC/H,CAAC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,0BAA0B,CAAC;AACzC,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,0BAA0B,CAAC;AACzC,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC"}
|
package/dist/session.d.ts
CHANGED
|
@@ -6,6 +6,14 @@ import { type OperatorCasEnv } from "./cas.js";
|
|
|
6
6
|
export interface AgentSessionEnv extends Partial<OperatorCasEnv> {
|
|
7
7
|
readonly PLATFORM_ORIGIN?: string;
|
|
8
8
|
readonly PLATFORM_SERVICE?: Fetcher;
|
|
9
|
+
/**
|
|
10
|
+
* 这个 Operator 自己的 ES256 私钥(PKCS#8 的 base64),也就是它 discovery
|
|
11
|
+
* descriptor 里发布公钥的那一把。配了它,调 Agent API 就不再需要共享口令。
|
|
12
|
+
*/
|
|
13
|
+
readonly OPERATOR_SIGNING_KEY?: string;
|
|
14
|
+
/** 没有密钥对时的那条路:同一把 webhook 共享密钥也能签断言,不新增凭据。 */
|
|
15
|
+
readonly OPERATOR_HMAC_KEY?: string;
|
|
16
|
+
/** @deprecated 0.5.0 之前的共享口令。Portal 侧删掉它那半之后这里也就可以删了。 */
|
|
9
17
|
readonly OPERATOR_AGENT_TOKEN?: string;
|
|
10
18
|
readonly LLM_API_KEY?: string;
|
|
11
19
|
readonly LLM_BASE_URL?: string;
|
|
@@ -39,5 +47,14 @@ export declare function createOperatorAgentSessionClass<TDoc, TQuery, TOp, TEnv
|
|
|
39
47
|
* 填一个不在其中的修订,整轮提交会被拒。
|
|
40
48
|
*/
|
|
41
49
|
readonly documentContractIdx?: number;
|
|
50
|
+
/**
|
|
51
|
+
* 这个 Operator 的身份,调 Agent API 时签在每一枚断言里。
|
|
52
|
+
*
|
|
53
|
+
* **必须与 discovery descriptor 里声明的 `declaredOperatorId` 是同一个常量**,
|
|
54
|
+
* 不能在两处各写一份字面量 —— 2026-10-10 的 design 就是这么出的事:仓里源码三个
|
|
55
|
+
* 分支都写 canvas-primary,线上那版是未提交改动构建的 design-primary,于是按源码
|
|
56
|
+
* 推出来的配置静默错配(见 unidocs 的 docs/operator-onboarding.md 坑 10)。
|
|
57
|
+
*/
|
|
58
|
+
readonly declaredOperatorId: string;
|
|
42
59
|
}): OperatorAgentSessionClass;
|
|
43
60
|
//# sourceMappingURL=session.d.ts.map
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAgD,KAAK,iBAAiB,EAAyB,KAAK,UAAU,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAgD,KAAK,iBAAiB,EAAyB,KAAK,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE5J,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzE,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAEtE,MAAM,WAAW,eAAgB,SAAQ,OAAO,CAAC,cAAc,CAAC;IAC9D,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,8CAA8C;IAC9C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,yDAAyD;IACzD,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AACD,MAAM,WAAW,oBAAqB,SAAQ,aAAa,CAAC,eAAe,CAAC;IAC1E,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AACD,MAAM,MAAM,yBAAyB,GAAG,KAAK,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,eAAe,KAAK,oBAAoB,CAAC;AAEpH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,SAAS,eAAe,GAAG,eAAe,EAAE,OAAO,EAAE;IAC1H,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,KAAK,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IAClH,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,WAAW,CAAC;IAC9C;;;;;;OAMG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC;;;;;;;OAOG;IACH,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC,GAAG,yBAAyB,CAgC5B"}
|
package/dist/session.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DurableObject } from "cloudflare:workers";
|
|
2
2
|
import { createAgentSessionCore, createPlatformClient } from "@unidocs/agent-operator-core";
|
|
3
|
+
import { agentCredential } from "./agent-credential.js";
|
|
3
4
|
import { createAlarmWakeScheduler, createSqlSessionStore } from "./agent-session-store.js";
|
|
4
5
|
import { createOperatorStorage } from "./cas.js";
|
|
5
6
|
export function createOperatorAgentSessionClass(options) {
|
|
@@ -23,7 +24,8 @@ export function createOperatorAgentSessionClass(options) {
|
|
|
23
24
|
kind: key => options.kind(context(key), env, key),
|
|
24
25
|
store: this.#store, wake: createAlarmWakeScheduler(ctx.storage),
|
|
25
26
|
platform: createPlatformClient({
|
|
26
|
-
origin: env.PLATFORM_ORIGIN ?? "",
|
|
27
|
+
origin: env.PLATFORM_ORIGIN ?? "",
|
|
28
|
+
credential: () => agentCredential(env, options.declaredOperatorId),
|
|
27
29
|
fetch: request => env.PLATFORM_SERVICE ? env.PLATFORM_SERVICE.fetch(request) : fetch(request),
|
|
28
30
|
}),
|
|
29
31
|
snapshots: storage.snapshots, provider: options.provider(env),
|
package/dist/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAkE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAkE,MAAM,8BAA8B,CAAC;AAC5J,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAuB,MAAM,UAAU,CAAC;AAwBtE,MAAM,UAAU,+BAA+B,CAAoE,OAgClH;IACC,OAAO,KAAM,SAAQ,aAA8B;QACxC,MAAM,CAA2C;QACjD,KAAK,CAAmB;QACjC,YAAY,GAAuB,EAAE,GAAoB;YACvD,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAChB,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAClH,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;YACxD,MAAM,OAAO,GAAG,CAAC,GAAe,EAAE,EAAE;gBAClC,IAAI,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACvC,IAAI,CAAC,KAAK,EAAE,CAAC;oBAAC,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAAC,CAAC;gBACzF,OAAO,KAAK,CAAC;YACf,CAAC,CAAC;YACF,IAAI,CAAC,KAAK,GAAG,sBAAsB,CAAC;gBAClC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAW,EAAE,GAAG,CAAC;gBACzD,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,wBAAwB,CAAC,GAAG,CAAC,OAAO,CAAC;gBAC/D,QAAQ,EAAE,oBAAoB,CAAC;oBAC7B,MAAM,EAAE,GAAG,CAAC,eAAe,IAAI,EAAE;oBACjC,UAAU,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,kBAAkB,CAAC;oBAClE,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;iBAC9F,CAAC;gBACF,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAW,CAAC;gBACrE,GAAG,CAAC,OAAO,CAAC,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,EAAE,CAAC;aAC3G,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,GAAe,EAAE,KAA6B,IAAmB,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACpH,KAAK,CAAC,KAAK;YACT,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,GAAG;gBAAE,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unidocs/operator-cloudflare",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Cloudflare runtime for the UniDocs Operator: Agent session Durable Object and operator CAS storage",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -30,11 +30,11 @@
|
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@unicas/tenant-blob-client": "0.1.0",
|
|
32
32
|
"@unicas/tenant-client": "0.1.0",
|
|
33
|
-
"@unidocs/agent-operator-core": "0.
|
|
34
|
-
"@unidocs/protocol": "0.
|
|
35
|
-
"@unidocs/protocol-platform": "0.
|
|
36
|
-
"@unidocs/service-auth": "0.
|
|
37
|
-
"@unidocs/svalue-codec": "0.
|
|
33
|
+
"@unidocs/agent-operator-core": "0.5.0",
|
|
34
|
+
"@unidocs/protocol": "0.4.0",
|
|
35
|
+
"@unidocs/protocol-platform": "0.4.0",
|
|
36
|
+
"@unidocs/service-auth": "0.5.0",
|
|
37
|
+
"@unidocs/svalue-codec": "0.4.0"
|
|
38
38
|
},
|
|
39
39
|
"scripts": {
|
|
40
40
|
"build": "tsc",
|