@nocobase/app-plugin-agents 1.0.0-beta.16 → 1.0.0-beta.18

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 (207) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +32 -21
  3. package/dist/client/chat/api.d.ts +1 -1
  4. package/dist/client/chat/api.d.ts.map +1 -1
  5. package/dist/client/chat/api.js +2 -2
  6. package/dist/client/chat/api.js.map +1 -1
  7. package/dist/client/chat/keys.d.ts +1 -0
  8. package/dist/client/chat/keys.d.ts.map +1 -1
  9. package/dist/client/chat/keys.js +1 -0
  10. package/dist/client/chat/keys.js.map +1 -1
  11. package/dist/client/chat/provider.d.ts +10 -4
  12. package/dist/client/chat/provider.d.ts.map +1 -1
  13. package/dist/client/chat/provider.js +86 -15
  14. package/dist/client/chat/provider.js.map +1 -1
  15. package/dist/client/chat/use-chat.d.ts +3 -1
  16. package/dist/client/chat/use-chat.d.ts.map +1 -1
  17. package/dist/client/chat/use-chat.js +2 -2
  18. package/dist/client/chat/use-chat.js.map +1 -1
  19. package/dist/client/chat/use-conversation-model.d.ts +12 -0
  20. package/dist/client/chat/use-conversation-model.d.ts.map +1 -0
  21. package/dist/client/chat/use-conversation-model.js +64 -0
  22. package/dist/client/chat/use-conversation-model.js.map +1 -0
  23. package/dist/client/chat.d.ts +1 -0
  24. package/dist/client/chat.d.ts.map +1 -1
  25. package/dist/client/chat.js +1 -0
  26. package/dist/client/chat.js.map +1 -1
  27. package/dist/client/model-suggestion.d.ts.map +1 -1
  28. package/dist/client/model-suggestion.js +4 -2
  29. package/dist/client/model-suggestion.js.map +1 -1
  30. package/dist/client/pages/usage/index.d.ts.map +1 -1
  31. package/dist/client/pages/usage/index.js +17 -5
  32. package/dist/client/pages/usage/index.js.map +1 -1
  33. package/dist/client/pages/usage/prices/model.d.ts +4 -4
  34. package/dist/client/pages/usage/prices/model.d.ts.map +1 -1
  35. package/dist/client/pages/usage/prices/model.js +2 -2
  36. package/dist/client/pages/usage/prices/model.js.map +1 -1
  37. package/dist/client/pages/usage/prices/price-cells.js +2 -2
  38. package/dist/client/pages/usage/prices/price-cells.js.map +1 -1
  39. package/dist/client/pages/usage/prices/prices-section.d.ts.map +1 -1
  40. package/dist/client/pages/usage/prices/prices-section.js +13 -13
  41. package/dist/client/pages/usage/prices/prices-section.js.map +1 -1
  42. package/dist/package.json +5 -2
  43. package/dist/server/cli/online-credential.d.ts +16 -0
  44. package/dist/server/cli/online-credential.d.ts.map +1 -0
  45. package/dist/server/cli/online-credential.js +51 -0
  46. package/dist/server/cli/online-credential.js.map +1 -0
  47. package/dist/server/cli/run-credential.d.ts +2 -0
  48. package/dist/server/cli/run-credential.d.ts.map +1 -1
  49. package/dist/server/cli/run-credential.js +12 -1
  50. package/dist/server/cli/run-credential.js.map +1 -1
  51. package/dist/server/cli/surface.js +2 -2
  52. package/dist/server/cli/surface.js.map +1 -1
  53. package/dist/server/composition.d.ts +2 -0
  54. package/dist/server/composition.d.ts.map +1 -1
  55. package/dist/server/composition.js +25 -4
  56. package/dist/server/composition.js.map +1 -1
  57. package/dist/server/core/agents/agent.service.d.ts +5 -0
  58. package/dist/server/core/agents/agent.service.d.ts.map +1 -1
  59. package/dist/server/core/agents/agent.service.js +6 -1
  60. package/dist/server/core/agents/agent.service.js.map +1 -1
  61. package/dist/server/core/agents/agent.views.d.ts +2 -0
  62. package/dist/server/core/agents/agent.views.d.ts.map +1 -1
  63. package/dist/server/core/agents/agent.views.js +4 -3
  64. package/dist/server/core/agents/agent.views.js.map +1 -1
  65. package/dist/server/core/brief/brief.js +1 -1
  66. package/dist/server/core/brief/brief.js.map +1 -1
  67. package/dist/server/core/conversations/chat-settings.d.ts +1 -0
  68. package/dist/server/core/conversations/chat-settings.d.ts.map +1 -1
  69. package/dist/server/core/conversations/chat-settings.js +71 -57
  70. package/dist/server/core/conversations/chat-settings.js.map +1 -1
  71. package/dist/server/core/conversations/conversation.service.d.ts.map +1 -1
  72. package/dist/server/core/conversations/conversation.service.js +3 -4
  73. package/dist/server/core/conversations/conversation.service.js.map +1 -1
  74. package/dist/server/core/reports/report.service.d.ts +1 -0
  75. package/dist/server/core/reports/report.service.d.ts.map +1 -1
  76. package/dist/server/core/reports/report.service.js +5 -2
  77. package/dist/server/core/reports/report.service.js.map +1 -1
  78. package/dist/server/core/runs/claim.d.ts +3 -1
  79. package/dist/server/core/runs/claim.d.ts.map +1 -1
  80. package/dist/server/core/runs/claim.js +370 -60
  81. package/dist/server/core/runs/claim.js.map +1 -1
  82. package/dist/server/core/runs/extensions.d.ts +22 -2
  83. package/dist/server/core/runs/extensions.d.ts.map +1 -1
  84. package/dist/server/core/runs/extensions.js +21 -2
  85. package/dist/server/core/runs/extensions.js.map +1 -1
  86. package/dist/server/core/runs/git-credentials.d.ts +5 -1
  87. package/dist/server/core/runs/git-credentials.d.ts.map +1 -1
  88. package/dist/server/core/runs/git-credentials.js +15 -2
  89. package/dist/server/core/runs/git-credentials.js.map +1 -1
  90. package/dist/server/core/runs/lifecycle.d.ts.map +1 -1
  91. package/dist/server/core/runs/lifecycle.js +9 -5
  92. package/dist/server/core/runs/lifecycle.js.map +1 -1
  93. package/dist/server/core/runs/runner-affinity.d.ts +6 -0
  94. package/dist/server/core/runs/runner-affinity.d.ts.map +1 -0
  95. package/dist/server/core/runs/runner-affinity.js +16 -0
  96. package/dist/server/core/runs/runner-affinity.js.map +1 -0
  97. package/dist/server/core/skills/skill.service.d.ts +2 -0
  98. package/dist/server/core/skills/skill.service.d.ts.map +1 -1
  99. package/dist/server/core/skills/skill.service.js +1 -0
  100. package/dist/server/core/skills/skill.service.js.map +1 -1
  101. package/dist/server/jobs/job.service.d.ts.map +1 -1
  102. package/dist/server/jobs/job.service.js +7 -4
  103. package/dist/server/jobs/job.service.js.map +1 -1
  104. package/dist/server/kernel/values.d.ts +5 -0
  105. package/dist/server/kernel/values.d.ts.map +1 -1
  106. package/dist/server/kernel/values.js +19 -0
  107. package/dist/server/kernel/values.js.map +1 -1
  108. package/dist/server/online/agent/configuration.d.ts +2 -2
  109. package/dist/server/online/agent/configuration.d.ts.map +1 -1
  110. package/dist/server/online/agent/configuration.js +21 -7
  111. package/dist/server/online/agent/configuration.js.map +1 -1
  112. package/dist/server/online/agent/index.d.ts +2 -1
  113. package/dist/server/online/agent/index.d.ts.map +1 -1
  114. package/dist/server/online/agent/index.js.map +1 -1
  115. package/dist/server/online/agent/native/backend.d.ts +2 -0
  116. package/dist/server/online/agent/native/backend.d.ts.map +1 -1
  117. package/dist/server/online/agent/native/backend.js +14 -12
  118. package/dist/server/online/agent/native/backend.js.map +1 -1
  119. package/dist/server/online/agent/native/execution.d.ts +2 -0
  120. package/dist/server/online/agent/native/execution.d.ts.map +1 -1
  121. package/dist/server/online/agent/native/execution.js +51 -22
  122. package/dist/server/online/agent/native/execution.js.map +1 -1
  123. package/dist/server/online/agent/native/types.d.ts +6 -0
  124. package/dist/server/online/agent/native/types.d.ts.map +1 -1
  125. package/dist/server/online/agent/runner/backend.d.ts.map +1 -1
  126. package/dist/server/online/agent/runner/backend.js +4 -3
  127. package/dist/server/online/agent/runner/backend.js.map +1 -1
  128. package/dist/server/online/agent/service.d.ts +2 -0
  129. package/dist/server/online/agent/service.d.ts.map +1 -1
  130. package/dist/server/online/agent/service.js +3 -1
  131. package/dist/server/online/agent/service.js.map +1 -1
  132. package/dist/server/online/agent/types.d.ts +15 -1
  133. package/dist/server/online/agent/types.d.ts.map +1 -1
  134. package/dist/server/online/sandbox/cli-command.d.ts +6 -0
  135. package/dist/server/online/sandbox/cli-command.d.ts.map +1 -0
  136. package/dist/server/online/sandbox/cli-command.js +370 -0
  137. package/dist/server/online/sandbox/cli-command.js.map +1 -0
  138. package/dist/server/online/sandbox/execution.d.ts +25 -0
  139. package/dist/server/online/sandbox/execution.d.ts.map +1 -0
  140. package/dist/server/online/sandbox/execution.js +63 -0
  141. package/dist/server/online/sandbox/execution.js.map +1 -0
  142. package/dist/server/online/sandbox/filesystem.d.ts +8 -0
  143. package/dist/server/online/sandbox/filesystem.d.ts.map +1 -0
  144. package/dist/server/online/sandbox/filesystem.js +72 -0
  145. package/dist/server/online/sandbox/filesystem.js.map +1 -0
  146. package/dist/server/online/sandbox/limits.d.ts +4 -0
  147. package/dist/server/online/sandbox/limits.d.ts.map +1 -0
  148. package/dist/server/online/sandbox/limits.js +46 -0
  149. package/dist/server/online/sandbox/limits.js.map +1 -0
  150. package/dist/server/online/sandbox/provider.d.ts +9 -0
  151. package/dist/server/online/sandbox/provider.d.ts.map +1 -0
  152. package/dist/server/online/sandbox/provider.js +237 -0
  153. package/dist/server/online/sandbox/provider.js.map +1 -0
  154. package/dist/server/online/sandbox/skills.d.ts +14 -0
  155. package/dist/server/online/sandbox/skills.d.ts.map +1 -0
  156. package/dist/server/online/sandbox/skills.js +56 -0
  157. package/dist/server/online/sandbox/skills.js.map +1 -0
  158. package/dist/server/online/sandbox/tools.d.ts +3 -0
  159. package/dist/server/online/sandbox/tools.d.ts.map +1 -0
  160. package/dist/server/online/sandbox/tools.js +35 -0
  161. package/dist/server/online/sandbox/tools.js.map +1 -0
  162. package/dist/server/online/sandbox/types.d.ts +72 -0
  163. package/dist/server/online/sandbox/types.d.ts.map +1 -0
  164. package/dist/server/online/sandbox/types.js +2 -0
  165. package/dist/server/online/sandbox/types.js.map +1 -0
  166. package/dist/server/providers/agents.d.ts +5 -2
  167. package/dist/server/providers/agents.d.ts.map +1 -1
  168. package/dist/server/providers/agents.js +63 -2
  169. package/dist/server/providers/agents.js.map +1 -1
  170. package/dist/server/routes/admin.d.ts.map +1 -1
  171. package/dist/server/routes/admin.js +1 -0
  172. package/dist/server/routes/admin.js.map +1 -1
  173. package/dist/server/routes/chat.d.ts +1 -1
  174. package/dist/server/routes/chat.d.ts.map +1 -1
  175. package/dist/server/routes/chat.js +15 -6
  176. package/dist/server/routes/chat.js.map +1 -1
  177. package/dist/server/routes/index.d.ts.map +1 -1
  178. package/dist/server/routes/index.js +17 -2
  179. package/dist/server/routes/index.js.map +1 -1
  180. package/dist/server/routes/openapi.js +1 -1
  181. package/dist/server/routes/openapi.js.map +1 -1
  182. package/dist/server/routes/schemas.js +1 -1
  183. package/dist/server/routes/schemas.js.map +1 -1
  184. package/dist/server/runners/runner.service.d.ts +1 -1
  185. package/dist/server/runners/runner.service.d.ts.map +1 -1
  186. package/dist/server/runners/runner.service.js +5 -1
  187. package/dist/server/runners/runner.service.js.map +1 -1
  188. package/dist/server/runners/runner.store.d.ts.map +1 -1
  189. package/dist/server/runners/runner.store.js +3 -1
  190. package/dist/server/runners/runner.store.js.map +1 -1
  191. package/dist/server/vendor/THIRD_PARTY_LICENSES.txt +782 -0
  192. package/dist/server/vendor/just-bash.d.ts +137 -0
  193. package/dist/server/vendor/just-bash.js +2102 -0
  194. package/dist/shared/conversations.d.ts +2 -1
  195. package/dist/shared/conversations.d.ts.map +1 -1
  196. package/dist/shared/conversations.js.map +1 -1
  197. package/dist/shared/runners.d.ts +1 -1
  198. package/dist/shared/runners.d.ts.map +1 -1
  199. package/dist/shared/runners.js +2 -0
  200. package/dist/shared/runners.js.map +1 -1
  201. package/docs/native-sandbox.md +55 -0
  202. package/docs/runner-agents.md +2 -0
  203. package/docs/ui-message-clients.md +10 -0
  204. package/package.json +11 -8
  205. package/skills/nocobase-app-plugin-agents/SKILL.md +1 -0
  206. package/skills/nocobase-app-plugin-agents/references/extension-points.md +21 -19
  207. package/skills/nocobase-app-plugin-agents/references/online-agent.md +2 -2
@@ -0,0 +1,9 @@
1
+ import type { SkillService } from '../../core/skills/skill.service.js';
2
+ import type { OnlineAgentSandboxProvider, OnlineAgentSandboxOptions } from './types.js';
3
+ type SandboxDependencies = OnlineAgentSandboxOptions & {
4
+ skills: SkillService;
5
+ };
6
+ /** Prepare Skills without credentials; own the CLI lease only while a Sandbox exists. */
7
+ export declare function createSandboxProvider(deps: SandboxDependencies): OnlineAgentSandboxProvider;
8
+ export {};
9
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../../server/online/sandbox/provider.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,KAAK,EACV,0BAA0B,EAK1B,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAMpB,KAAK,mBAAmB,GAAG,yBAAyB,GAAG;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC;AAMhF,yFAAyF;AACzF,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,mBAAmB,GACxB,0BAA0B,CAI5B"}
@@ -0,0 +1,237 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { HEADERS } from '@nocobase/agent-protocol';
3
+ import { callerIdentityOf } from '../../cli/run-credential.js';
4
+ import { Bash, getCommandNames, } from '../../vendor/just-bash.js';
5
+ import { createSandboxFilesystem } from './filesystem.js';
6
+ import { loadSkills } from './skills.js';
7
+ import { cliCommand } from './cli-command.js';
8
+ import { sandboxLimits, clip } from './limits.js';
9
+ /** Prepare Skills without credentials; own the CLI lease only while a Sandbox exists. */
10
+ export function createSandboxProvider(deps) {
11
+ return {
12
+ prepare: (input) => prepareSandbox(deps, input),
13
+ };
14
+ }
15
+ async function prepareSandbox(deps, input) {
16
+ input.context.signal.throwIfAborted();
17
+ const loaded = await loadSkills(deps.skills, input.skill, deps.builtinSkills);
18
+ return new PreparedSandbox(deps, input, loaded);
19
+ }
20
+ /** The selected Skill snapshot exists before any filesystem, CLI or credential is allocated. */
21
+ class PreparedSandbox {
22
+ deps;
23
+ input;
24
+ loaded;
25
+ instructions;
26
+ released = false;
27
+ constructor(deps, input, loaded) {
28
+ this.deps = deps;
29
+ this.input = input;
30
+ this.loaded = loaded;
31
+ this.instructions = this.sandboxInstructions(deps.bin?.());
32
+ }
33
+ sandboxInstructions(bin) {
34
+ return [
35
+ 'Virtual shell: /tmp is the only writable directory; /skills is read-only. No host files, environment, network or external runtimes.',
36
+ bin
37
+ ? 'Application CLI: ' +
38
+ bin +
39
+ '. Use --help to discover current commands. Authorization and business rules apply; never retry an uncertain write without checking its result.'
40
+ : 'No application CLI is configured.',
41
+ 'Selected skills (read with skill or cat only when needed):',
42
+ ...[...this.loaded.skills].map(([slug, skill]) => slug + ': ' + skill.description + ' (/skills/' + slug + '/SKILL.md)'),
43
+ ].join('\n');
44
+ }
45
+ readSkill(name) {
46
+ if (this.released)
47
+ return Promise.reject(new Error('Execution is closed.'));
48
+ this.input.context.signal.throwIfAborted();
49
+ const skill = this.loaded.skills.get(name);
50
+ return Promise.resolve({
51
+ ok: !!skill,
52
+ output: skill
53
+ ? clip([skill.markdown, 'Support files:', ...skill.listing].join('\n'))
54
+ : 'Unknown selected skill.',
55
+ });
56
+ }
57
+ async create() {
58
+ if (this.released)
59
+ throw new Error('Execution is closed.');
60
+ this.input.context.signal.throwIfAborted();
61
+ const filesystem = createSandboxFilesystem(this.loaded.files, undefined, this.loaded.unreadable);
62
+ // InMemoryFs owns the mounted storage; do not retain a second file map.
63
+ this.clearFiles();
64
+ return createSandbox(this, this.deps, this.input, filesystem);
65
+ }
66
+ close() {
67
+ this.released = true;
68
+ }
69
+ dispose() {
70
+ this.close();
71
+ this.loaded.skills.clear();
72
+ this.clearFiles();
73
+ }
74
+ clearFiles() {
75
+ for (const path of Object.keys(this.loaded.files))
76
+ delete this.loaded.files[path];
77
+ }
78
+ }
79
+ /** Creation owns partial-resource cleanup, including failures before a shell is returned. */
80
+ async function createSandbox(preparation, deps, input, filesystem) {
81
+ let lease;
82
+ try {
83
+ const application = deps.cli?.();
84
+ let surface;
85
+ if (application) {
86
+ lease = application.credentials.issue(input.context.user.id, input.executionId ?? randomUUID());
87
+ surface = await loadCommandSurface(application, lease.token);
88
+ }
89
+ return new SandboxExecution(preparation, input, filesystem, surface, lease);
90
+ }
91
+ catch (error) {
92
+ try {
93
+ await filesystem.dispose();
94
+ }
95
+ finally {
96
+ lease?.release();
97
+ }
98
+ throw error;
99
+ }
100
+ }
101
+ async function loadCommandSurface(application, token) {
102
+ const session = await application.auth.getSession(new Headers({ [HEADERS.runToken]: token }));
103
+ const identity = callerIdentityOf(session ?? undefined);
104
+ if (!identity)
105
+ throw new Error('OnlineAgent caller is unavailable.');
106
+ const surface = await application.commandsOf(identity, token);
107
+ if (surface && !/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/u.test(surface.bin))
108
+ throw new Error('Invalid application CLI brand.');
109
+ return surface;
110
+ }
111
+ function createBash(filesystem, command) {
112
+ return new Bash({
113
+ fs: filesystem.fs,
114
+ cwd: '/tmp',
115
+ env: { HOME: '/tmp' },
116
+ executionLimitProfile: 'hardened',
117
+ commands: getCommandNames().filter((name) => name !== 'sqlite3'),
118
+ python: false,
119
+ javascript: false,
120
+ customCommands: command ? [command] : [],
121
+ executionLimits: {
122
+ maxOutputSize: sandboxLimits.shellOutput,
123
+ maxExecutionTimeMs: sandboxLimits.durationMs,
124
+ },
125
+ });
126
+ }
127
+ function shellResult(result) {
128
+ return {
129
+ ok: result.exitCode === 0,
130
+ output: clip([
131
+ 'exit code ' + result.exitCode,
132
+ result.stdout ? result.stdout.replace(/\n$/u, '') : '',
133
+ result.stderr ? '[stderr]\n' + result.stderr.replace(/\n$/u, '') : '',
134
+ ]
135
+ .filter(Boolean)
136
+ .join('\n')),
137
+ exitCode: result.exitCode,
138
+ };
139
+ }
140
+ /** Own serialized shell calls, real CLI work and retryable cleanup for one execution. */
141
+ class SandboxExecution {
142
+ preparation;
143
+ input;
144
+ filesystem;
145
+ lease;
146
+ instructions;
147
+ bash;
148
+ abort = new AbortController();
149
+ work = new Set();
150
+ queue = Promise.resolve();
151
+ cleanup;
152
+ closed = false;
153
+ constructor(preparation, input, filesystem, surface, lease) {
154
+ this.preparation = preparation;
155
+ this.input = input;
156
+ this.filesystem = filesystem;
157
+ this.lease = lease;
158
+ const cli = surface ? cliCommand(surface, input.context.signal) : undefined;
159
+ this.bash = createBash(filesystem, cli ? this.trackCommand(cli) : undefined);
160
+ filesystem.lock();
161
+ this.instructions = preparation.sandboxInstructions(surface?.bin);
162
+ }
163
+ trackCommand(command) {
164
+ return {
165
+ ...command,
166
+ execute: (args, ctx) => {
167
+ // Bash can detach a cancelled command; keep owning its actual application work.
168
+ const task = command.execute(args, ctx);
169
+ this.work.add(task);
170
+ void task.finally(() => this.work.delete(task)).catch(() => { });
171
+ return task;
172
+ },
173
+ };
174
+ }
175
+ exec(command, options) {
176
+ if (this.closed)
177
+ return Promise.reject(new Error('Sandbox is closed.'));
178
+ // The deadline includes time spent waiting in the queue.
179
+ const deadline = AbortSignal.timeout(sandboxLimits.durationMs);
180
+ const signal = AbortSignal.any([
181
+ this.input.context.signal,
182
+ this.abort.signal,
183
+ deadline,
184
+ ...(options.abortSignal ? [options.abortSignal] : []),
185
+ ]);
186
+ const task = this.queue
187
+ .catch(() => { })
188
+ .then(() => this.run(command, signal));
189
+ this.queue = task;
190
+ return task;
191
+ }
192
+ async run(command, signal) {
193
+ signal.throwIfAborted();
194
+ try {
195
+ return shellResult(await this.bash.exec(command, { signal }));
196
+ }
197
+ catch (error) {
198
+ signal.throwIfAborted();
199
+ return {
200
+ ok: false,
201
+ output: clip(error instanceof Error ? error.message : 'Virtual shell failed.'),
202
+ exitCode: 1,
203
+ };
204
+ }
205
+ finally {
206
+ // Cancellation must not release the execution gate before real CLI work exits.
207
+ await Promise.allSettled([...this.work]);
208
+ signal.throwIfAborted();
209
+ }
210
+ }
211
+ readSkill(name) {
212
+ if (this.closed)
213
+ return Promise.reject(new Error('Sandbox is closed.'));
214
+ return this.preparation.readSkill(name);
215
+ }
216
+ dispose() {
217
+ if (this.cleanup)
218
+ return this.cleanup;
219
+ this.closed = true;
220
+ this.preparation.close();
221
+ this.abort.abort();
222
+ this.cleanup = this.releaseResources().catch((error) => {
223
+ // A failed cleanup is retryable, but never reopens this execution.
224
+ this.cleanup = undefined;
225
+ throw error;
226
+ });
227
+ return this.cleanup;
228
+ }
229
+ async releaseResources() {
230
+ await this.queue.catch(() => { });
231
+ await Promise.allSettled([...this.work]);
232
+ await this.filesystem.dispose();
233
+ this.preparation.dispose();
234
+ this.lease?.release();
235
+ }
236
+ }
237
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../../server/online/sandbox/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { SkillService } from '../../core/skills/skill.service.js';
2
+ import type { OnlineAgentSandboxSkillCatalog } from './types.js';
3
+ /** Read current resources once per SDK segment; no resource versions survive preparation. */
4
+ export declare function loadSkills(service: SkillService, ids: readonly string[], builtinSkills?: OnlineAgentSandboxSkillCatalog): Promise<{
5
+ skills: Map<string, {
6
+ name: string;
7
+ description: string;
8
+ markdown: string;
9
+ listing: string[];
10
+ }>;
11
+ files: Record<string, string>;
12
+ unreadable: Map<string, string>;
13
+ }>;
14
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../../server/online/sandbox/skills.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAEvE,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAGjE,6FAA6F;AAC7F,wBAAsB,UAAU,CAC9B,OAAO,EAAE,YAAY,EACrB,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,aAAa,CAAC,EAAE,8BAA8B,GAC7C,OAAO,CAAC;IACT,MAAM,EAAE,GAAG,CACT,MAAM,EACN;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAC3E,CAAC;IACF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC,CA4DD"}
@@ -0,0 +1,56 @@
1
+ import { skillFilePathProblem } from '../../../shared/skills.js';
2
+ import { sandboxLimits } from './limits.js';
3
+ /** Read current resources once per SDK segment; no resource versions survive preparation. */
4
+ export async function loadSkills(service, ids, builtinSkills) {
5
+ const skills = new Map();
6
+ const files = {};
7
+ const unreadable = new Map();
8
+ let bytes = 0;
9
+ const selected = [];
10
+ for (const id of ids) {
11
+ // Selection is a trusted server scope. SkillService has no per-user read/enable policy.
12
+ const builtin = builtinSkills?.get(id);
13
+ const current = builtin ? await builtin() : await service.get(id);
14
+ if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/u.test(current.slug) ||
15
+ skills.has(current.slug))
16
+ throw new Error('Invalid or duplicate selected skill slug.');
17
+ bytes += Buffer.byteLength(current.content);
18
+ if (bytes > sandboxLimits.skillBytes)
19
+ throw new Error('Selected skill entry exceeds mount budget.');
20
+ skills.set(current.slug, {
21
+ name: current.name,
22
+ description: current.description,
23
+ markdown: current.content,
24
+ listing: [],
25
+ });
26
+ files['/skills/' + current.slug + '/SKILL.md'] = current.content;
27
+ selected.push(current);
28
+ }
29
+ // Reserve all entry documents before admitting supporting text in stable path order.
30
+ for (const current of selected) {
31
+ const paths = new Set();
32
+ for (const file of [...current.files].sort((a, b) => a.path < b.path ? -1 : a.path > b.path ? 1 : 0)) {
33
+ if (skillFilePathProblem(file.path) || paths.has(file.path))
34
+ throw new Error('Invalid or duplicate skill support path.');
35
+ paths.add(file.path);
36
+ const path = '/skills/' + current.slug + '/' + file.path;
37
+ const size = file.content === null ? 0 : Buffer.byteLength(file.content);
38
+ const reason = file.content === null
39
+ ? 'Binary skill file is not readable.'
40
+ : bytes + size > sandboxLimits.skillBytes
41
+ ? 'Skill file exceeds mount budget.'
42
+ : undefined;
43
+ skills
44
+ .get(current.slug)
45
+ .listing.push(file.path + (reason ? ' [unreadable: ' + reason + ']' : ''));
46
+ if (reason)
47
+ unreadable.set(path, reason);
48
+ else {
49
+ files[path] = file.content;
50
+ bytes += size;
51
+ }
52
+ }
53
+ }
54
+ return { skills, files, unreadable };
55
+ }
56
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../../server/online/sandbox/skills.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,6FAA6F;AAC7F,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAqB,EACrB,GAAsB,EACtB,aAA8C;IAS9C,MAAM,MAAM,GAAG,IAAI,GAAG,EAGnB,CAAC;IACJ,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,wFAAwF;QACxF,MAAM,OAAO,GAAG,aAAa,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClE,IACE,CAAC,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACjD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;YAExB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,KAAK,GAAG,aAAa,CAAC,UAAU;YAClC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;YACvB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,QAAQ,EAAE,OAAO,CAAC,OAAO;YACzB,OAAO,EAAE,EAAE;SACZ,CAAC,CAAC;QACH,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;QACjE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IACD,qFAAqF;IACrF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAChC,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAClD,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC/C,EAAE,CAAC;YACF,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;gBACzD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC9D,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM,IAAI,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC;YACzD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzE,MAAM,MAAM,GACV,IAAI,CAAC,OAAO,KAAK,IAAI;gBACnB,CAAC,CAAC,oCAAoC;gBACtC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,aAAa,CAAC,UAAU;oBACvC,CAAC,CAAC,kCAAkC;oBACpC,CAAC,CAAC,SAAS,CAAC;YAClB,MAAM;iBACH,GAAG,CAAC,OAAO,CAAC,IAAI,CAAE;iBAClB,OAAO,CAAC,IAAI,CACX,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,GAAG,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAC5D,CAAC;YACJ,IAAI,MAAM;gBAAE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;iBACpC,CAAC;gBACJ,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAQ,CAAC;gBAC5B,KAAK,IAAI,IAAI,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { OnlineAgentConfigurator } from '../agent/configuration.js';
2
+ export declare function registerSandboxTools(configurator: OnlineAgentConfigurator): void;
3
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../../server/online/sandbox/tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAIzE,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,uBAAuB,GACpC,IAAI,CA8BN"}
@@ -0,0 +1,35 @@
1
+ import { z } from 'zod';
2
+ import { sandboxLimits } from './limits.js';
3
+ const registered = new WeakSet();
4
+ export function registerSandboxTools(configurator) {
5
+ if (registered.has(configurator))
6
+ return;
7
+ configurator.registerTool('bash', {
8
+ version: '1',
9
+ definition: {
10
+ description: [
11
+ 'Run a shell command in your sandbox (bash syntax; ls, cat, grep, find, sed, awk, jq and the like).',
12
+ 'When configured, reach the application with its command line (named in the sandbox instructions); use --help to discover current commands.',
13
+ 'Your selected skills are at /skills/<name>/, read-only.',
14
+ `Write scratch files under /tmp only. No network; nothing is installed or run for real, so a skill's scripts cannot be executed. Each command stops after ${sandboxLimits.durationMs / 1000} seconds.`,
15
+ ].join(' '),
16
+ inputSchema: z.object({ command: z.string() }),
17
+ async execute({ command }, options) {
18
+ const sandbox = await options.context.execution.getSandbox();
19
+ return sandbox.exec(command, options);
20
+ },
21
+ toModelOutput: ({ output }) => ({ type: 'json', value: output }),
22
+ },
23
+ });
24
+ configurator.registerTool('skill', {
25
+ version: '1',
26
+ definition: {
27
+ description: 'Read one of your skills: its SKILL.md and the list of its files, which you read with the bash tool. Read a skill when its description matches what you are doing, and follow it.',
28
+ inputSchema: z.object({ name: z.string() }),
29
+ execute: ({ name }, options) => options.context.execution.readSkill(name),
30
+ toModelOutput: ({ output }) => ({ type: 'json', value: output }),
31
+ },
32
+ });
33
+ registered.add(configurator);
34
+ }
35
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../server/online/sandbox/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,UAAU,GAAG,IAAI,OAAO,EAA2B,CAAC;AAC1D,MAAM,UAAU,oBAAoB,CAClC,YAAqC;IAErC,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC;QAAE,OAAO;IACzC,YAAY,CAAC,YAAY,CAAC,MAAM,EAAE;QAChC,OAAO,EAAE,GAAG;QACZ,UAAU,EAAE;YACV,WAAW,EAAE;gBACX,oGAAoG;gBACpG,4IAA4I;gBAC5I,yDAAyD;gBACzD,4JAA4J,aAAa,CAAC,UAAU,GAAG,IAAI,WAAW;aACvM,CAAC,IAAI,CAAC,GAAG,CAAC;YACX,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO;gBAChC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;gBAC7D,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACxC,CAAC;YACD,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;SACjE;KACF,CAAC,CAAC;IACH,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE;QACjC,OAAO,EAAE,GAAG;QACZ,UAAU,EAAE;YACV,WAAW,EACT,kLAAkL;YACpL,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;YACzE,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;SACjE;KACF,CAAC,CAAC;IACH,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,72 @@
1
+ import type { Auth } from '@nocobase/app-plugin-authentication';
2
+ import type { OnlineAgentCredentials } from '../../cli/online-credential.js';
3
+ import type { CallerIdentity } from '../../core/callers/index.js';
4
+ import type { OnlineAgentToolContext } from '../agent/types.js';
5
+ import type { CliCommand } from '@nocobase/app-cli-client/parse';
6
+ /** Application dependencies; the CLI is resolved only when a Sandbox is actually created. */
7
+ export interface OnlineAgentSandboxOptions {
8
+ builtinSkills?: OnlineAgentSandboxSkillCatalog;
9
+ bin?: () => string | undefined;
10
+ cli?: () => {
11
+ auth: Auth;
12
+ credentials: OnlineAgentCredentials;
13
+ commandsOf(identity: CallerIdentity, token: string): Promise<CommandSurface | undefined>;
14
+ };
15
+ }
16
+ /** Current application-owned Skill resources, loaded anew for every SDK execution segment. */
17
+ export interface OnlineAgentSandboxSkill {
18
+ readonly slug: string;
19
+ readonly name: string;
20
+ readonly description: string;
21
+ readonly content: string;
22
+ readonly files: readonly {
23
+ readonly path: string;
24
+ readonly content: string | null;
25
+ }[];
26
+ }
27
+ export type OnlineAgentSandboxSkillCatalog = ReadonlyMap<string, () => Promise<OnlineAgentSandboxSkill>>;
28
+ export type OnlineAgentSandboxInput = {
29
+ sessionId: string;
30
+ executionId?: string;
31
+ context: Omit<OnlineAgentToolContext, 'execution'>;
32
+ skill: readonly string[];
33
+ };
34
+ export interface OnlineAgentSandbox {
35
+ readonly instructions: string;
36
+ exec(command: string, options: {
37
+ toolCallId: string;
38
+ abortSignal?: AbortSignal;
39
+ }): Promise<{
40
+ ok: boolean;
41
+ output: string;
42
+ exitCode: number;
43
+ }>;
44
+ readSkill(name: string): Promise<{
45
+ ok: boolean;
46
+ output: string;
47
+ }>;
48
+ dispose(): Promise<void>;
49
+ }
50
+ export interface OnlineAgentSandboxPreparation {
51
+ readonly instructions: string;
52
+ readSkill(name: string): Promise<{
53
+ ok: boolean;
54
+ output: string;
55
+ }>;
56
+ create(): Promise<OnlineAgentSandbox>;
57
+ dispose(): void;
58
+ }
59
+ export interface OnlineAgentSandboxProvider {
60
+ prepare(input: OnlineAgentSandboxInput): Promise<OnlineAgentSandboxPreparation>;
61
+ }
62
+ /** Caller-filtered application commands and authenticated, application-local dispatch. */
63
+ export interface CommandSurface {
64
+ readonly bin: string;
65
+ readonly commands: readonly CliCommand[];
66
+ send(request: {
67
+ readonly method: string;
68
+ readonly path: string;
69
+ readonly body?: string | FormData;
70
+ }, signal?: AbortSignal): Promise<Response>;
71
+ }
72
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../server/online/sandbox/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../server/online/sandbox/types.ts"],"names":[],"mappings":""}
@@ -4,12 +4,12 @@ import type { OnlineAgentRecoveryConfig } from '../online/agent/types.js';
4
4
  * conversations, and the vector queue's worker. The runners' side (their announcements, the sweeper and the wake-ups of
5
5
  * work sent back with a back-off) is `runners.ts`.
6
6
  */
7
- import type { RunApp } from '@nocobase/agent-protocol';
7
+ import { type RunApp } from '@nocobase/agent-protocol';
8
8
  import type { AppPluginApplication } from '@nocobase/app-server/plugins';
9
9
  import { ServiceProvider } from '@nocobase/service-provider';
10
10
  import type { VectorsConfig } from '../vectors/index.js';
11
11
  import type { DistConfig } from '../distribution/index.js';
12
- import type { AgentCli } from '../core/runs/index.js';
12
+ import { type AgentCli } from '../core/runs/index.js';
13
13
  /** `agents` in the application's configuration. */
14
14
  export interface AgentsConfig {
15
15
  readonly uiRecovery?: OnlineAgentRecoveryConfig;
@@ -57,6 +57,9 @@ export declare class AgentsProvider extends ServiceProvider<AppPluginApplication
57
57
  readonly name: string;
58
58
  private readonly releases;
59
59
  private stoppingVectors;
60
+ private surface;
61
+ /** Historical command surface, with execution-local authentication and cancellation. */
62
+ private commandsOf;
60
63
  register(): void;
61
64
  /** How runners name this application: `agents.app`, else the CLI's name, else the application's. */
62
65
  private runApp;
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../server/providers/agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAE1E;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAMvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAQzE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAa7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAMtD,mDAAmD;AACnD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,yBAAyB,CAAC;IAChD;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE;QACd,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;KACpC,CAAC;IACF,yFAAyF;IACzF,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzD;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACjC,oGAAoG;IACpG,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAMD,qBAAa,cAAe,SAAQ,eAAe,CAAC,oBAAoB,CAAC;IACvE,SAAgB,IAAI,EAAE,MAAM,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,eAAe,CAA4B;IAEnC,QAAQ,IAAI,IAAI;IAsEhC,oGAAoG;IACpG,OAAO,CAAC,MAAM;IAMd,gGAAgG;IAChG,OAAO,CAAC,qBAAqB;IAUP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3C,iGAAiG;IACjG,OAAO,CAAC,cAAc;IAgBtB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAqBJ,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAY/C,kGAAkG;IAClG,OAAO,CAAC,QAAQ;CA0HjB"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../server/providers/agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAE1E;;;;GAIG;AACH,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAMhE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAQzE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAa7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAYvE,mDAAmD;AACnD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,yBAAyB,CAAC;IAChD;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE;QACd,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;KACpC,CAAC;IACF,yFAAyF;IACzF,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzD;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACjC,oGAAoG;IACpG,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAMD,qBAAa,cAAe,SAAQ,eAAe,CAAC,oBAAoB,CAAC;IACvE,SAAgB,IAAI,EAAE,MAAM,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,OAAO,CAAyB;IAExC,wFAAwF;IACxF,OAAO,CAAC,UAAU;IA6CF,QAAQ,IAAI,IAAI;IAqFhC,oGAAoG;IACpG,OAAO,CAAC,MAAM;IAMd,gGAAgG;IAChG,OAAO,CAAC,qBAAqB;IAUP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3C,iGAAiG;IACjG,OAAO,CAAC,cAAc;IAgBtB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA4BJ,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAY/C,kGAAkG;IAClG,OAAO,CAAC,QAAQ;CA0HjB"}
@@ -1,4 +1,10 @@
1
1
  import { mayAccessRun } from '../core/runs/access.js';
2
+ /**
3
+ * Binds the plugin's services, and at boot connects them to the platform: realtime announcements of runs and
4
+ * conversations, and the vector queue's worker. The runners' side (their announcements, the sweeper and the wake-ups of
5
+ * work sent back with a back-off) is `runners.ts`.
6
+ */
7
+ import { HEADERS } from '@nocobase/agent-protocol';
2
8
  import { runRetentionDays } from '../core/runs/run-data-purge.js';
3
9
  import { retryBaseDelayMs } from '../core/runs/policy.js';
4
10
  import { serverFileRepositoryManagerToken } from '@nocobase/app-plugin-file/server';
@@ -19,10 +25,12 @@ import { createAgents } from '../composition.js';
19
25
  import { createChatFileStorage } from '../core/conversations/index.js';
20
26
  import { directoryDisk } from '../core/skills/index.js';
21
27
  import { createAgentsSecretsStores } from '../secrets-stores.js';
28
+ import { resolveAgentCli } from '../core/runs/index.js';
22
29
  import { runCredentialResolver } from '../cli/run-credential.js';
23
30
  import { bindCliSurface } from '../cli/surface.js';
24
31
  import { agentsSecurityFragment } from '../routes/openapi.js';
25
32
  import { agentsToken } from '../tokens.js';
33
+ import { OnlineAgentCredentials, onlineAgentCredentialsToken, } from '../cli/online-credential.js';
26
34
  /** The first purge of chat files never sent waits this long after boot, then runs every `PURGE_INTERVAL_MS`. */
27
35
  const PURGE_DELAY_MS = 60_000;
28
36
  const PURGE_INTERVAL_MS = 60 * 60_000;
@@ -30,13 +38,62 @@ export class AgentsProvider extends ServiceProvider {
30
38
  name = ACCESS_NAMESPACE;
31
39
  releases = [];
32
40
  stoppingVectors;
41
+ surface;
42
+ /** Historical command surface, with execution-local authentication and cancellation. */
43
+ commandsOf(identity, token) {
44
+ const { container } = this.app;
45
+ const surface = this.surface;
46
+ if (!surface || !container.has(cliToken) || !container.has(apiDocsToken))
47
+ return Promise.resolve(undefined);
48
+ const cli = container.resolve(cliToken);
49
+ const base = this.app.publicBasePath.replace(/\/+$/u, '');
50
+ const config = this.app.config.get('agents');
51
+ const bin = resolveAgentCli(config?.cli, this.runApp(config)).name;
52
+ return (async () => {
53
+ const manifest = cli.manifestFor(await container.resolve(apiDocsToken).getDocument(), await surface.callerOf(identity));
54
+ return {
55
+ bin,
56
+ commands: manifest.commands,
57
+ send: async (request, signal) => {
58
+ const path = base && request.path.startsWith(`${base}/`)
59
+ ? request.path.slice(base.length)
60
+ : request.path;
61
+ return this.app.router.fetch(new Request(`http://application${path}`, {
62
+ method: request.method,
63
+ headers: {
64
+ [HEADERS.runToken]: token,
65
+ accept: 'application/json',
66
+ 'x-nocobase-client': 'cli',
67
+ ...(typeof request.body === 'string'
68
+ ? { 'content-type': 'application/json' }
69
+ : {}),
70
+ },
71
+ ...(request.body === undefined ? {} : { body: request.body }),
72
+ signal,
73
+ }));
74
+ },
75
+ };
76
+ })();
77
+ }
33
78
  register() {
34
79
  runRetentionDays(this.app.config.get('agents')?.runs?.retentionDays);
35
80
  retryBaseDelayMs(this.app.config.get('agents')?.runs?.retryBaseDelayMs);
81
+ this.app.container.singleton(onlineAgentCredentialsToken, () => new OnlineAgentCredentials());
36
82
  this.app.container.singleton(agentsToken, (resolver) => {
37
83
  const config = this.app.config.get('agents');
38
84
  return createAgents({
39
85
  resolver,
86
+ sandbox: {
87
+ bin: () => {
88
+ const config = this.app.config.get('agents');
89
+ return resolveAgentCli(config?.cli, this.runApp(config)).name;
90
+ },
91
+ cli: () => ({
92
+ auth: resolver.resolve(authenticationToken),
93
+ credentials: resolver.resolve(onlineAgentCredentialsToken),
94
+ commandsOf: (identity, token) => this.commandsOf(identity, token),
95
+ }),
96
+ },
40
97
  retryBaseDelayMs: retryBaseDelayMs(config?.runs?.retryBaseDelayMs),
41
98
  runRetentionDays: () => runRetentionDays(this.app.config.get('agents')?.runs?.retentionDays),
42
99
  database: resolver.resolve(databaseManagerToken),
@@ -150,7 +207,7 @@ export class AgentsProvider extends ServiceProvider {
150
207
  if (!container.has(authenticationToken))
151
208
  return;
152
209
  const auth = container.resolve(authenticationToken);
153
- this.releases.push(auth.addCredentialResolver(runCredentialResolver(services)));
210
+ this.releases.push(auth.addCredentialResolver(runCredentialResolver(services)), auth.addCredentialResolver(container.resolve(onlineAgentCredentialsToken).resolve));
154
211
  if (!container.has(cliToken) || !container.has(authorizationToken))
155
212
  return;
156
213
  const authorization = container.resolve(authorizationToken);
@@ -160,7 +217,11 @@ export class AgentsProvider extends ServiceProvider {
160
217
  authenticatePerson: every(auth.required({ scopedKeys: true }), authorization.middleware()),
161
218
  gate: services.gate,
162
219
  });
163
- this.releases.push(() => surface.release());
220
+ this.surface = surface;
221
+ this.releases.push(() => {
222
+ surface.release();
223
+ this.surface = undefined;
224
+ });
164
225
  }
165
226
  async shutdown() {
166
227
  try {