@tidblink/server 0.3.0-rc.0 → 0.4.0-rc.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.
Files changed (124) hide show
  1. package/README.md +557 -368
  2. package/dist/audio.d.ts +9 -0
  3. package/dist/audio.d.ts.map +1 -1
  4. package/dist/audio.js +6 -1
  5. package/dist/audio.js.map +1 -1
  6. package/dist/backend-connection.d.ts +89 -0
  7. package/dist/backend-connection.d.ts.map +1 -0
  8. package/dist/backend-connection.js +300 -0
  9. package/dist/backend-connection.js.map +1 -0
  10. package/dist/backend-pool.d.ts +93 -0
  11. package/dist/backend-pool.d.ts.map +1 -0
  12. package/dist/backend-pool.js +419 -0
  13. package/dist/backend-pool.js.map +1 -0
  14. package/dist/client-tool-executor.d.ts +31 -0
  15. package/dist/client-tool-executor.d.ts.map +1 -0
  16. package/dist/client-tool-executor.js +190 -0
  17. package/dist/client-tool-executor.js.map +1 -0
  18. package/dist/client-tools.d.ts +0 -25
  19. package/dist/client-tools.d.ts.map +1 -1
  20. package/dist/client-tools.js +1 -67
  21. package/dist/client-tools.js.map +1 -1
  22. package/dist/connector-callback.d.ts +92 -0
  23. package/dist/connector-callback.d.ts.map +1 -0
  24. package/dist/connector-callback.js +155 -0
  25. package/dist/connector-callback.js.map +1 -0
  26. package/dist/connectors.d.ts +66 -0
  27. package/dist/connectors.d.ts.map +1 -0
  28. package/dist/connectors.js +71 -0
  29. package/dist/connectors.js.map +1 -0
  30. package/dist/control.js +1 -1
  31. package/dist/control.js.map +1 -1
  32. package/dist/errors.d.ts +34 -11
  33. package/dist/errors.d.ts.map +1 -1
  34. package/dist/errors.js +36 -8
  35. package/dist/errors.js.map +1 -1
  36. package/dist/events.d.ts +158 -0
  37. package/dist/events.d.ts.map +1 -0
  38. package/dist/events.js +110 -0
  39. package/dist/events.js.map +1 -0
  40. package/dist/files.js +9 -9
  41. package/dist/files.js.map +1 -1
  42. package/dist/history.d.ts +38 -1
  43. package/dist/history.d.ts.map +1 -1
  44. package/dist/history.js +1 -1
  45. package/dist/history.js.map +1 -1
  46. package/dist/http.d.ts +28 -4
  47. package/dist/http.d.ts.map +1 -1
  48. package/dist/http.js +44 -24
  49. package/dist/http.js.map +1 -1
  50. package/dist/index.d.ts +26 -13
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +10 -4
  53. package/dist/index.js.map +1 -1
  54. package/dist/organization.d.ts +45 -28
  55. package/dist/organization.d.ts.map +1 -1
  56. package/dist/organization.js +67 -73
  57. package/dist/organization.js.map +1 -1
  58. package/dist/realtime.d.ts +0 -1
  59. package/dist/realtime.d.ts.map +1 -1
  60. package/dist/realtime.js +0 -1
  61. package/dist/realtime.js.map +1 -1
  62. package/dist/session-connection.d.ts +144 -0
  63. package/dist/session-connection.d.ts.map +1 -0
  64. package/dist/session-connection.js +334 -0
  65. package/dist/session-connection.js.map +1 -0
  66. package/dist/session-send.d.ts +49 -0
  67. package/dist/session-send.d.ts.map +1 -0
  68. package/dist/session-send.js +179 -0
  69. package/dist/session-send.js.map +1 -0
  70. package/dist/session.d.ts +37 -8
  71. package/dist/session.d.ts.map +1 -1
  72. package/dist/session.js +56 -29
  73. package/dist/session.js.map +1 -1
  74. package/dist/skills.d.ts +103 -0
  75. package/dist/skills.d.ts.map +1 -0
  76. package/dist/skills.js +98 -0
  77. package/dist/skills.js.map +1 -0
  78. package/dist/sse.d.ts +5 -2
  79. package/dist/sse.d.ts.map +1 -1
  80. package/dist/sse.js +7 -2
  81. package/dist/sse.js.map +1 -1
  82. package/dist/template-switch.d.ts +51 -0
  83. package/dist/template-switch.d.ts.map +1 -0
  84. package/dist/template-switch.js +81 -0
  85. package/dist/template-switch.js.map +1 -0
  86. package/dist/templates.d.ts +129 -0
  87. package/dist/templates.d.ts.map +1 -0
  88. package/dist/templates.js +92 -0
  89. package/dist/templates.js.map +1 -0
  90. package/dist/turn.d.ts +4 -0
  91. package/dist/turn.d.ts.map +1 -1
  92. package/dist/turn.js +17 -13
  93. package/dist/turn.js.map +1 -1
  94. package/dist/usage.d.ts +13 -197
  95. package/dist/usage.d.ts.map +1 -1
  96. package/dist/usage.js +5 -3
  97. package/dist/usage.js.map +1 -1
  98. package/dist/user.d.ts +10 -51
  99. package/dist/user.d.ts.map +1 -1
  100. package/dist/user.js +18 -105
  101. package/dist/user.js.map +1 -1
  102. package/examples/control-turn.mjs +9 -4
  103. package/examples/create-session.mjs +37 -24
  104. package/examples/http-connector.mjs +127 -0
  105. package/examples/lamp-backend.mjs +175 -0
  106. package/examples/prepare-realtime-connection.mjs +18 -7
  107. package/examples/read-usage.mjs +7 -25
  108. package/examples/send-message.mjs +9 -4
  109. package/examples/submit-audio.mjs +9 -4
  110. package/examples/upload-file.mjs +9 -4
  111. package/package.json +7 -13
  112. package/dist/progress.d.ts +0 -34
  113. package/dist/progress.d.ts.map +0 -1
  114. package/dist/progress.js +0 -154
  115. package/dist/progress.js.map +0 -1
  116. package/dist/schedulers.d.ts +0 -129
  117. package/dist/schedulers.d.ts.map +0 -1
  118. package/dist/schedulers.js +0 -91
  119. package/dist/schedulers.js.map +0 -1
  120. package/examples/answer-client-tool.mjs +0 -69
  121. package/examples/observe-message.mjs +0 -44
  122. package/examples/organization-session.mjs +0 -66
  123. package/examples/provision-user.mjs +0 -83
  124. package/examples/schedule-task.mjs +0 -67
@@ -1,66 +0,0 @@
1
- import { pathToFileURL } from "node:url";
2
- import { OrganizationClient } from "@tidblink/server";
3
-
4
- /** Retain the owner, selected Template/model and both creation identities before calling. */
5
- export async function organizationSessionWorkflow({
6
- baseUrl,
7
- organizationApiKey,
8
- userId,
9
- agentTemplateId,
10
- agentCreationKey,
11
- sessionCreationKey,
12
- model,
13
- }) {
14
- const organization = new OrganizationClient({
15
- baseUrl,
16
- apiKey: organizationApiKey,
17
- });
18
- const user = organization.user(userId);
19
- const templates = await user.listAgentTemplates();
20
- const models = await user.listModels();
21
- const agent = await user.createAgent({
22
- agentTemplateId,
23
- idempotencyKey: agentCreationKey,
24
- });
25
- const session = await agent.createSession({
26
- idempotencyKey: sessionCreationKey,
27
- ...(model === undefined ? {} : { model }),
28
- });
29
- return { organization, user, agent, session, templates, models };
30
- }
31
-
32
- if (
33
- process.argv[1] &&
34
- import.meta.url === pathToFileURL(process.argv[1]).href
35
- ) {
36
- const {
37
- AGENT_SERVICE_URL,
38
- ORGANIZATION_API_KEY,
39
- END_USER_ID,
40
- TEMPLATE_ID,
41
- AGENT_CREATION_KEY,
42
- SESSION_CREATION_KEY,
43
- MODEL_ID,
44
- } = process.env;
45
- if (
46
- !AGENT_SERVICE_URL ||
47
- !ORGANIZATION_API_KEY ||
48
- !END_USER_ID ||
49
- !TEMPLATE_ID ||
50
- !AGENT_CREATION_KEY ||
51
- !SESSION_CREATION_KEY
52
- )
53
- throw new Error(
54
- "Set AGENT_SERVICE_URL, ORGANIZATION_API_KEY, END_USER_ID, TEMPLATE_ID, AGENT_CREATION_KEY and SESSION_CREATION_KEY; MODEL_ID is optional",
55
- );
56
- const { agent, session } = await organizationSessionWorkflow({
57
- baseUrl: AGENT_SERVICE_URL,
58
- organizationApiKey: ORGANIZATION_API_KEY,
59
- userId: END_USER_ID,
60
- agentTemplateId: TEMPLATE_ID,
61
- agentCreationKey: AGENT_CREATION_KEY,
62
- sessionCreationKey: SESSION_CREATION_KEY,
63
- model: MODEL_ID,
64
- });
65
- console.log(JSON.stringify({ agentId: agent.id, sessionId: session.id }));
66
- }
@@ -1,83 +0,0 @@
1
- import { open } from "node:fs/promises";
2
- import { pathToFileURL } from "node:url";
3
- import {
4
- ConflictError,
5
- OrganizationClient,
6
- OutcomeUnknownError,
7
- } from "@tidblink/server";
8
-
9
- /** Each successful invocation issues a new credential. Retain it in your secret manager. */
10
- export async function provisionUser({
11
- baseUrl,
12
- organizationApiKey,
13
- externalId,
14
- displayName,
15
- }) {
16
- const client = new OrganizationClient({
17
- baseUrl,
18
- apiKey: organizationApiKey,
19
- });
20
- const organization = await client.getOrganization();
21
- const mapping = externalId.trim();
22
- if (!mapping)
23
- throw new TypeError("externalId is required for reconciliation");
24
- const find = async () =>
25
- (await client.listEndUsers()).find((user) => user.externalId === mapping);
26
- let user = await find();
27
- if (!user) {
28
- try {
29
- user = await client.createEndUser({
30
- externalId: mapping,
31
- ...(displayName === undefined ? {} : { displayName }),
32
- });
33
- } catch (error) {
34
- if (
35
- !(error instanceof OutcomeUnknownError) &&
36
- !(error instanceof ConflictError && error.code === "resource_conflict")
37
- )
38
- throw error;
39
- user = await find().catch(() => undefined);
40
- if (!user) throw error;
41
- }
42
- }
43
- // Metadata cannot recover a lost token. This issuance is deliberately never repeated here.
44
- const issued = await client.createUserApiKey(user.userId, {
45
- name: "application-backend",
46
- });
47
- return { organization, user, ...issued };
48
- }
49
-
50
- if (
51
- process.argv[1] &&
52
- import.meta.url === pathToFileURL(process.argv[1]).href
53
- ) {
54
- const {
55
- AGENT_SERVICE_URL,
56
- ORGANIZATION_API_KEY,
57
- END_USER_EXTERNAL_ID,
58
- USER_CREDENTIAL_FILE,
59
- } = process.env;
60
- if (
61
- !AGENT_SERVICE_URL ||
62
- !ORGANIZATION_API_KEY ||
63
- !END_USER_EXTERNAL_ID ||
64
- !USER_CREDENTIAL_FILE
65
- ) {
66
- throw new Error(
67
- "Set AGENT_SERVICE_URL, ORGANIZATION_API_KEY, END_USER_EXTERNAL_ID and USER_CREDENTIAL_FILE",
68
- );
69
- }
70
- // Reserve a new private destination before issuing a credential; never overwrite an existing secret.
71
- const destination = await open(USER_CREDENTIAL_FILE, "wx", 0o600);
72
- try {
73
- const result = await provisionUser({
74
- baseUrl: AGENT_SERVICE_URL,
75
- organizationApiKey: ORGANIZATION_API_KEY,
76
- externalId: END_USER_EXTERNAL_ID,
77
- });
78
- await destination.writeFile(JSON.stringify(result) + "\n");
79
- console.log("User credential saved to USER_CREDENTIAL_FILE");
80
- } finally {
81
- await destination.close();
82
- }
83
- }
@@ -1,67 +0,0 @@
1
- import { setTimeout as delay } from "node:timers/promises";
2
- import { pathToFileURL } from "node:url";
3
- import { UserClient } from "@tidblink/server";
4
-
5
- /** Persist the exact runAt, prompt and creation key before calling. */
6
- export async function scheduleTaskWorkflow({
7
- baseUrl,
8
- userApiKey,
9
- agentId,
10
- idempotencyKey,
11
- runAt,
12
- prompt,
13
- title = "Scheduled task",
14
- timeoutMs = 30000,
15
- }) {
16
- const user = new UserClient({ baseUrl, apiKey: userApiKey });
17
- const created = await user.schedulers.create({
18
- agentId,
19
- idempotencyKey,
20
- title,
21
- prompt,
22
- schedule: { kind: "once", runAt },
23
- });
24
- const deadline = Date.now() + timeoutMs;
25
- while (Date.now() < deadline) {
26
- const { fires } = await user.schedulers.fires(
27
- created.scheduler.schedulerId,
28
- );
29
- const fire = fires.find((item) => item.executionStatus !== "pending");
30
- if (fire) {
31
- const turn =
32
- fire.result.sessionId && fire.result.turnId
33
- ? await user
34
- .session(fire.result.sessionId)
35
- .getTurn(fire.result.turnId)
36
- : null;
37
- return { scheduler: created.scheduler, fire, turn };
38
- }
39
- await delay(100);
40
- }
41
- throw new Error(
42
- `Waiting stopped; read Scheduler ${created.scheduler.schedulerId} fires later. Its schedule remains active.`,
43
- );
44
- }
45
-
46
- if (
47
- process.argv[1] &&
48
- import.meta.url === pathToFileURL(process.argv[1]).href
49
- ) {
50
- try {
51
- const result = await scheduleTaskWorkflow({
52
- baseUrl: process.env.AGENT_SERVICE_URL,
53
- userApiKey: process.env.USER_API_KEY,
54
- agentId: process.env.AGENT_ID,
55
- idempotencyKey: process.env.SCHEDULER_IDEMPOTENCY_KEY,
56
- runAt: process.env.SCHEDULE_RUN_AT,
57
- prompt: process.env.SCHEDULE_PROMPT,
58
- });
59
- console.log(JSON.stringify(result));
60
- if (result.fire.executionStatus === "failed") process.exitCode = 1;
61
- } catch (error) {
62
- console.error(
63
- error instanceof Error ? error.message : "Scheduled task failed",
64
- );
65
- process.exitCode = 1;
66
- }
67
- }