@downcity/agent 1.1.86 → 1.1.91

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 (78) hide show
  1. package/bin/config/AgentInitializer.d.ts.map +1 -1
  2. package/bin/config/AgentInitializer.js +2 -1
  3. package/bin/config/AgentInitializer.js.map +1 -1
  4. package/bin/config/Paths.d.ts +8 -0
  5. package/bin/config/Paths.d.ts.map +1 -1
  6. package/bin/config/Paths.js +10 -0
  7. package/bin/config/Paths.js.map +1 -1
  8. package/bin/executor/Executor.d.ts.map +1 -1
  9. package/bin/executor/Executor.js +3 -0
  10. package/bin/executor/Executor.js.map +1 -1
  11. package/bin/executor/messages/AssistantFileResource.d.ts +31 -0
  12. package/bin/executor/messages/AssistantFileResource.d.ts.map +1 -0
  13. package/bin/executor/messages/AssistantFileResource.js +113 -0
  14. package/bin/executor/messages/AssistantFileResource.js.map +1 -0
  15. package/bin/executor/messages/SessionAttachmentMapper.d.ts +8 -0
  16. package/bin/executor/messages/SessionAttachmentMapper.d.ts.map +1 -1
  17. package/bin/executor/messages/SessionAttachmentMapper.js +54 -0
  18. package/bin/executor/messages/SessionAttachmentMapper.js.map +1 -1
  19. package/bin/executor/messages/SessionMessageCodec.d.ts.map +1 -1
  20. package/bin/executor/messages/SessionMessageCodec.js +5 -3
  21. package/bin/executor/messages/SessionMessageCodec.js.map +1 -1
  22. package/bin/executor/tools/plugin/PluginToolBridge.d.ts.map +1 -1
  23. package/bin/executor/tools/plugin/PluginToolBridge.js +9 -2
  24. package/bin/executor/tools/plugin/PluginToolBridge.js.map +1 -1
  25. package/bin/index.d.ts +1 -1
  26. package/bin/index.d.ts.map +1 -1
  27. package/bin/index.js.map +1 -1
  28. package/bin/plugin/core/ImagePlugin.d.ts +62 -0
  29. package/bin/plugin/core/ImagePlugin.d.ts.map +1 -1
  30. package/bin/plugin/core/ImagePlugin.js +230 -7
  31. package/bin/plugin/core/ImagePlugin.js.map +1 -1
  32. package/bin/sandbox/LinuxBubblewrapSandbox.d.ts +21 -0
  33. package/bin/sandbox/LinuxBubblewrapSandbox.d.ts.map +1 -0
  34. package/bin/sandbox/LinuxBubblewrapSandbox.js +184 -0
  35. package/bin/sandbox/LinuxBubblewrapSandbox.js.map +1 -0
  36. package/bin/sandbox/SandboxConfigResolver.d.ts +5 -0
  37. package/bin/sandbox/SandboxConfigResolver.d.ts.map +1 -1
  38. package/bin/sandbox/SandboxConfigResolver.js +11 -4
  39. package/bin/sandbox/SandboxConfigResolver.js.map +1 -1
  40. package/bin/sandbox/SandboxRunner.d.ts +1 -1
  41. package/bin/sandbox/SandboxRunner.d.ts.map +1 -1
  42. package/bin/sandbox/SandboxRunner.js +11 -3
  43. package/bin/sandbox/SandboxRunner.js.map +1 -1
  44. package/bin/sandbox/types/SandboxRuntime.d.ts +6 -2
  45. package/bin/sandbox/types/SandboxRuntime.d.ts.map +1 -1
  46. package/bin/session/Session.d.ts.map +1 -1
  47. package/bin/session/Session.js +1 -0
  48. package/bin/session/Session.js.map +1 -1
  49. package/bin/session/services/SessionTurnService.d.ts +5 -0
  50. package/bin/session/services/SessionTurnService.d.ts.map +1 -1
  51. package/bin/session/services/SessionTurnService.js +3 -0
  52. package/bin/session/services/SessionTurnService.js.map +1 -1
  53. package/bin/types/executor/SessionRunContext.d.ts +8 -0
  54. package/bin/types/executor/SessionRunContext.d.ts.map +1 -1
  55. package/bin/types/plugin/ImagePlugin.d.ts +79 -2
  56. package/bin/types/plugin/ImagePlugin.d.ts.map +1 -1
  57. package/package.json +2 -2
  58. package/scripts/assistant-file-resource.test.mjs +91 -0
  59. package/scripts/image-plugin-job.test.mjs +155 -0
  60. package/scripts/linux-bubblewrap-sandbox.test.mjs +142 -0
  61. package/src/config/AgentInitializer.ts +2 -0
  62. package/src/config/Paths.ts +11 -0
  63. package/src/executor/Executor.ts +3 -0
  64. package/src/executor/messages/AssistantFileResource.ts +155 -0
  65. package/src/executor/messages/SessionAttachmentMapper.ts +59 -0
  66. package/src/executor/messages/SessionMessageCodec.ts +9 -3
  67. package/src/executor/tools/plugin/PluginToolBridge.ts +13 -2
  68. package/src/index.ts +4 -0
  69. package/src/plugin/core/ImagePlugin.ts +284 -7
  70. package/src/sandbox/LinuxBubblewrapSandbox.ts +229 -0
  71. package/src/sandbox/SandboxConfigResolver.ts +13 -7
  72. package/src/sandbox/SandboxRunner.ts +11 -3
  73. package/src/sandbox/types/SandboxRuntime.ts +7 -2
  74. package/src/session/Session.ts +1 -0
  75. package/src/session/services/SessionTurnService.ts +8 -0
  76. package/src/types/executor/SessionRunContext.ts +9 -0
  77. package/src/types/plugin/ImagePlugin.ts +79 -2
  78. package/tsconfig.tsbuildinfo +1 -1
package/bin/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,WAAW;AACX,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAoDrC,gBAAgB;AAChB,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,kBAAkB;AAClB,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EACL,kCAAkC,EAClC,kBAAkB,GACnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,2BAA2B,EAAE,MAAM,kEAAkE,CAAC;AAC/G,OAAO,EAAE,2BAA2B,EAAE,MAAM,4DAA4D,CAAC;AACzG,OAAO,EAAE,wBAAwB,EAAE,MAAM,4DAA4D,CAAC;AACtG,OAAO,EAAE,8BAA8B,EAAE,MAAM,wEAAwE,CAAC;AAmBxH,OAAO,EAAE,kCAAkC,EAAE,MAAM,sDAAsD,CAAC;AAC1G,OAAO,EACL,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,2DAA2D,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,+CAA+C,CAAC;AAE3E,iBAAiB;AACjB,OAAO,EACL,6BAA6B,EAC7B,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,wBAAwB,EACxB,2BAA2B,EAC3B,yBAAyB,EACzB,YAAY,GACb,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,+BAA+B,EAC/B,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,kCAAkC,GACnC,MAAM,gCAAgC,CAAC;AAExC,eAAe;AACf,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,sBAAsB;AACtB,OAAO,EACL,eAAe,EACf,cAAc,GACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,EACL,8BAA8B,EAC9B,qCAAqC,GACtC,MAAM,wCAAwC,CAAC;AAEhD,iBAAiB;AACjB,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAEjF,UAAU;AACV,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,yBAAyB,GAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAE5E,KAAK;AACL,OAAO,EAAE,SAAS,EAAE,MAAM,EAAe,MAAM,0BAA0B,CAAC;AAmJ1E,iBAAiB;AACjB,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,4BAA4B,EAC5B,oBAAoB,GACrB,MAAM,wCAAwC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,WAAW;AACX,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAoDrC,gBAAgB;AAChB,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,kBAAkB;AAClB,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EACL,kCAAkC,EAClC,kBAAkB,GACnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,2BAA2B,EAAE,MAAM,kEAAkE,CAAC;AAC/G,OAAO,EAAE,2BAA2B,EAAE,MAAM,4DAA4D,CAAC;AACzG,OAAO,EAAE,wBAAwB,EAAE,MAAM,4DAA4D,CAAC;AACtG,OAAO,EAAE,8BAA8B,EAAE,MAAM,wEAAwE,CAAC;AAmBxH,OAAO,EAAE,kCAAkC,EAAE,MAAM,sDAAsD,CAAC;AAC1G,OAAO,EACL,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,2DAA2D,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,+CAA+C,CAAC;AAE3E,iBAAiB;AACjB,OAAO,EACL,6BAA6B,EAC7B,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,wBAAwB,EACxB,2BAA2B,EAC3B,yBAAyB,EACzB,YAAY,GACb,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,+BAA+B,EAC/B,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,kCAAkC,GACnC,MAAM,gCAAgC,CAAC;AAExC,eAAe;AACf,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,sBAAsB;AACtB,OAAO,EACL,eAAe,EACf,cAAc,GACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,EACL,8BAA8B,EAC9B,qCAAqC,GACtC,MAAM,wCAAwC,CAAC;AAEhD,iBAAiB;AACjB,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAEjF,UAAU;AACV,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,yBAAyB,GAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAE5E,KAAK;AACL,OAAO,EAAE,SAAS,EAAE,MAAM,EAAe,MAAM,0BAA0B,CAAC;AAuJ1E,iBAAiB;AACjB,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,4BAA4B,EAC5B,oBAAoB,GACrB,MAAM,wCAAwC,CAAC"}
@@ -27,15 +27,77 @@ export declare class ImagePlugin extends BasePlugin {
27
27
  */
28
28
  readonly description: string;
29
29
  private readonly image;
30
+ private readonly create_job?;
31
+ private readonly read_job_status?;
32
+ private readonly read_job_result?;
33
+ private readonly wait_timeout_ms;
34
+ private readonly poll_interval_ms;
35
+ private readonly local_jobs;
30
36
  constructor(options: ImagePluginOptions);
31
37
  /**
32
38
  * 图片插件给模型的最小使用说明。
33
39
  */
34
40
  system(_context: AgentContext): string;
41
+ private create_local_job;
42
+ private run_local_job;
43
+ private read_local_job;
44
+ private serialize_local_status;
45
+ private serialize_local_result;
46
+ private wait_for_job;
35
47
  /**
36
48
  * 显式 action 集合。
37
49
  */
38
50
  readonly actions: {
51
+ create: {
52
+ execute: ({ payload }: {
53
+ payload: JsonValue;
54
+ }) => Promise<{
55
+ success: boolean;
56
+ data: JsonObject;
57
+ message: string;
58
+ error?: undefined;
59
+ } | {
60
+ success: boolean;
61
+ error: string;
62
+ message: string;
63
+ data?: undefined;
64
+ }>;
65
+ };
66
+ status: {
67
+ execute: ({ payload }: {
68
+ payload: JsonValue;
69
+ }) => Promise<{
70
+ success: boolean;
71
+ data: JsonObject;
72
+ message: string;
73
+ error?: undefined;
74
+ } | {
75
+ success: boolean;
76
+ error: string;
77
+ message: string;
78
+ data?: undefined;
79
+ }>;
80
+ };
81
+ result: {
82
+ execute: ({ payload }: {
83
+ payload: JsonValue;
84
+ }) => Promise<{
85
+ success: boolean;
86
+ data: JsonObject;
87
+ message: string;
88
+ error?: undefined;
89
+ } | {
90
+ success: boolean;
91
+ data: JsonObject;
92
+ error: string;
93
+ message: string;
94
+ } | {
95
+ success: boolean;
96
+ error: string;
97
+ message: string;
98
+ data?: undefined;
99
+ }>;
100
+ };
39
101
  generate: {
40
102
  execute: ({ payload }: {
41
103
  payload: JsonValue;
@@ -1 +1 @@
1
- {"version":3,"file":"ImagePlugin.d.ts","sourceRoot":"","sources":["../../../src/plugin/core/ImagePlugin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,EAEV,kBAAkB,EAEnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAqCzD;;GAEG;AACH,qBAAa,WAAY,SAAQ,UAAU;IACzC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;gBAExC,OAAO,EAAE,kBAAkB;IAiBvC;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM;IAStC;;OAEG;IACH,QAAQ,CAAC,OAAO;;mCAEiB;gBAAE,OAAO,EAAE,SAAS,CAAA;aAAE;;sBAMjB,UAAU;;;;;;;;;;MAY9C;CACH"}
1
+ {"version":3,"file":"ImagePlugin.d.ts","sourceRoot":"","sources":["../../../src/plugin/core/ImagePlugin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,EAKV,kBAAkB,EAEnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAkGzD;;GAEG;AACH,qBAAa,WAAY,SAAQ,UAAU;IACzC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAA+B;IAC3D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAA+B;IAChE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAA+B;IAChE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0C;gBAEzD,OAAO,EAAE,kBAAkB;IA2CvC;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM;IAWtC,OAAO,CAAC,gBAAgB;YA2BV,aAAa;IAmB3B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,sBAAsB;IAc9B,OAAO,CAAC,sBAAsB;YAYhB,YAAY;IAiB1B;;OAEG;IACH,QAAQ,CAAC,OAAO;;mCAEiB;gBAAE,OAAO,EAAE,SAAS,CAAA;aAAE;;sBAQlB,UAAU;;;;;;;;;;;mCAad;gBAAE,OAAO,EAAE,SAAS,CAAA;aAAE;;sBAQlB,UAAU;;;;;;;;;;;mCAad;gBAAE,OAAO,EAAE,SAAS,CAAA;aAAE;;sBAST,UAAU;;;;;sBAOjB,UAAU;;;;;;;;;;;mCAoBhB;gBAAE,OAAO,EAAE,SAAS,CAAA;aAAE;;sBASjB,UAAU;;;;;;;;;;MAY9C;CACH"}
@@ -6,10 +6,13 @@
6
6
  * - 具体模型、Provider、鉴权与上游协议由调用方传入的 image 函数处理。
7
7
  * - action 返回 AI SDK UIMessage,后续由 plugin tool bridge 抽取 file parts 写回 assistant 消息。
8
8
  */
9
+ import crypto from "node:crypto";
9
10
  import { BasePlugin } from "../../plugin/core/BasePlugin.js";
10
11
  const DEFAULT_IMAGE_PLUGIN_NAME = "image";
11
12
  const DEFAULT_IMAGE_PLUGIN_TITLE = "Image";
12
13
  const DEFAULT_IMAGE_PLUGIN_DESCRIPTION = "Generate images and return them as assistant file parts.";
14
+ const DEFAULT_WAIT_TIMEOUT_MS = 60_000;
15
+ const DEFAULT_POLL_INTERVAL_MS = 3_000;
13
16
  /**
14
17
  * 判断值是否为普通对象。
15
18
  */
@@ -28,6 +31,14 @@ function normalize_image_payload(payload) {
28
31
  }
29
32
  return { ...record };
30
33
  }
34
+ function normalize_job_id_payload(payload) {
35
+ const record = to_record(payload ?? {});
36
+ const job_id = String(record?.job_id || "").trim();
37
+ if (!job_id) {
38
+ throw new TypeError("ImagePlugin job action requires job_id");
39
+ }
40
+ return { job_id };
41
+ }
31
42
  /**
32
43
  * 校验 image 函数返回的 UIMessage。
33
44
  */
@@ -38,6 +49,22 @@ function normalize_image_result(result) {
38
49
  }
39
50
  return result;
40
51
  }
52
+ /**
53
+ * 归一化任务状态查询结果,确保 status action 不携带图片结果。
54
+ */
55
+ function normalize_job_status_result(result) {
56
+ return {
57
+ job_id: result.job_id,
58
+ status: result.status,
59
+ ...(result.message ? { message: result.message } : {}),
60
+ ...(result.error ? { error: result.error } : {}),
61
+ ...(typeof result.poll_after_ms === "number"
62
+ ? { poll_after_ms: result.poll_after_ms }
63
+ : {}),
64
+ ...(result.created_at ? { created_at: result.created_at } : {}),
65
+ ...(result.updated_at ? { updated_at: result.updated_at } : {}),
66
+ };
67
+ }
41
68
  /**
42
69
  * Agent 图片生成插件。
43
70
  */
@@ -55,40 +82,236 @@ export class ImagePlugin extends BasePlugin {
55
82
  */
56
83
  description;
57
84
  image;
85
+ create_job;
86
+ read_job_status;
87
+ read_job_result;
88
+ wait_timeout_ms;
89
+ poll_interval_ms;
90
+ local_jobs = new Map();
58
91
  constructor(options) {
59
92
  super();
60
93
  const name = String(options.name || DEFAULT_IMAGE_PLUGIN_NAME).trim();
61
94
  if (!name) {
62
95
  throw new Error("ImagePlugin requires a non-empty name");
63
96
  }
64
- if (typeof options.image !== "function") {
65
- throw new Error("ImagePlugin requires an image(input) function");
97
+ const has_custom_job_api = Boolean(options.create || options.status || options.result);
98
+ if (has_custom_job_api &&
99
+ (typeof options.create !== "function" ||
100
+ typeof options.status !== "function" ||
101
+ typeof options.result !== "function")) {
102
+ throw new Error("ImagePlugin custom job API requires create, status, and result functions");
103
+ }
104
+ if (!has_custom_job_api && typeof options.image !== "function") {
105
+ throw new Error("ImagePlugin requires either image(input) or create/status/result functions");
66
106
  }
67
107
  this.name = name;
68
108
  this.title = String(options.title || DEFAULT_IMAGE_PLUGIN_TITLE).trim();
69
109
  this.description = String(options.description || DEFAULT_IMAGE_PLUGIN_DESCRIPTION).trim();
70
110
  this.image = options.image;
111
+ this.create_job = options.create;
112
+ this.read_job_status = options.status;
113
+ this.read_job_result = options.result;
114
+ this.wait_timeout_ms =
115
+ typeof options.wait_timeout_ms === "number" && options.wait_timeout_ms > 0
116
+ ? options.wait_timeout_ms
117
+ : DEFAULT_WAIT_TIMEOUT_MS;
118
+ this.poll_interval_ms =
119
+ typeof options.poll_interval_ms === "number" && options.poll_interval_ms > 0
120
+ ? options.poll_interval_ms
121
+ : DEFAULT_POLL_INTERVAL_MS;
71
122
  }
72
123
  /**
73
124
  * 图片插件给模型的最小使用说明。
74
125
  */
75
126
  system(_context) {
76
127
  return [
77
- "Image generation is available through the plugin_call tool.",
78
- `Call plugin "${this.name}" action "generate" when the user asks to create, render, draw, or edit an image.`,
79
- "Pass a JSON payload with prompt, optional size/aspect_ratio/quality/n, and optional provider_options.",
80
- "The generated image files will be attached to the final assistant message automatically.",
128
+ "Image generation is available through the plugin_call tool as an observable job workflow.",
129
+ `Call plugin "${this.name}" action "create" when the user asks to create, render, draw, or edit an image.`,
130
+ `Then call plugin "${this.name}" action "status" with { job_id } to inspect progress.`,
131
+ `When status is succeeded, call plugin "${this.name}" action "result" with { job_id } to attach the generated files.`,
132
+ "Use action \"generate\" only as a compatibility shortcut when you explicitly need to wait for completion.",
133
+ "Pass a JSON payload with prompt, optional size/aspect_ratio/quality/n, and optional provider_options to create/generate.",
81
134
  ].join("\n");
82
135
  }
136
+ create_local_job(input) {
137
+ if (typeof this.image !== "function") {
138
+ throw new Error("ImagePlugin local image job requires image(input)");
139
+ }
140
+ const now = new Date().toISOString();
141
+ const job_id = `img_${crypto.randomUUID()}`;
142
+ const record = {
143
+ job_id,
144
+ status: "running",
145
+ message: "image job is running",
146
+ created_at: now,
147
+ updated_at: now,
148
+ };
149
+ this.local_jobs.set(job_id, record);
150
+ void this.run_local_job(record, input, this.image);
151
+ return {
152
+ job_id,
153
+ status: record.status,
154
+ message: record.message,
155
+ poll_after_ms: this.poll_interval_ms,
156
+ created_at: record.created_at,
157
+ updated_at: record.updated_at,
158
+ };
159
+ }
160
+ async run_local_job(record, input, image) {
161
+ try {
162
+ const message = normalize_image_result(await image(input));
163
+ record.status = "succeeded";
164
+ record.result = message;
165
+ record.message = "image job succeeded";
166
+ record.updated_at = new Date().toISOString();
167
+ }
168
+ catch (error) {
169
+ record.status = "failed";
170
+ record.error = String(error);
171
+ record.message = "image job failed";
172
+ record.updated_at = new Date().toISOString();
173
+ }
174
+ }
175
+ read_local_job(job_id) {
176
+ const record = this.local_jobs.get(job_id);
177
+ if (!record) {
178
+ throw new Error(`Unknown image job: ${job_id}`);
179
+ }
180
+ return record;
181
+ }
182
+ serialize_local_status(record) {
183
+ return {
184
+ job_id: record.job_id,
185
+ status: record.status,
186
+ ...(record.message ? { message: record.message } : {}),
187
+ ...(record.error ? { error: record.error } : {}),
188
+ ...(record.status === "running" || record.status === "queued"
189
+ ? { poll_after_ms: this.poll_interval_ms }
190
+ : {}),
191
+ created_at: record.created_at,
192
+ updated_at: record.updated_at,
193
+ };
194
+ }
195
+ serialize_local_result(record) {
196
+ return {
197
+ job_id: record.job_id,
198
+ status: record.status,
199
+ ...(record.result ? { result: record.result } : {}),
200
+ ...(record.error ? { error: record.error } : {}),
201
+ ...(record.message ? { message: record.message } : {}),
202
+ created_at: record.created_at,
203
+ updated_at: record.updated_at,
204
+ };
205
+ }
206
+ async wait_for_job(job_id) {
207
+ const deadline = Date.now() + this.wait_timeout_ms;
208
+ while (Date.now() <= deadline) {
209
+ const result = this.read_job_result
210
+ ? await this.read_job_result({ job_id })
211
+ : this.serialize_local_result(this.read_local_job(job_id));
212
+ if (result.status === "succeeded" && result.result) {
213
+ return normalize_image_result(result.result);
214
+ }
215
+ if (result.status === "failed") {
216
+ throw new Error(result.error || result.message || "image job failed");
217
+ }
218
+ await new Promise((resolve) => setTimeout(resolve, this.poll_interval_ms));
219
+ }
220
+ throw new Error(`image job timed out: ${job_id}`);
221
+ }
83
222
  /**
84
223
  * 显式 action 集合。
85
224
  */
86
225
  actions = {
226
+ create: {
227
+ execute: async ({ payload }) => {
228
+ try {
229
+ const input = normalize_image_payload(payload);
230
+ const result = this.create_job
231
+ ? await this.create_job(input)
232
+ : this.create_local_job(input);
233
+ return {
234
+ success: true,
235
+ data: result,
236
+ message: result.message || "image job created",
237
+ };
238
+ }
239
+ catch (error) {
240
+ return {
241
+ success: false,
242
+ error: String(error),
243
+ message: String(error),
244
+ };
245
+ }
246
+ },
247
+ },
248
+ status: {
249
+ execute: async ({ payload }) => {
250
+ try {
251
+ const input = normalize_job_id_payload(payload);
252
+ const result = this.read_job_status
253
+ ? normalize_job_status_result(await this.read_job_status(input))
254
+ : this.serialize_local_status(this.read_local_job(input.job_id));
255
+ return {
256
+ success: true,
257
+ data: result,
258
+ message: result.message || `image job ${result.status}`,
259
+ };
260
+ }
261
+ catch (error) {
262
+ return {
263
+ success: false,
264
+ error: String(error),
265
+ message: String(error),
266
+ };
267
+ }
268
+ },
269
+ },
270
+ result: {
271
+ execute: async ({ payload }) => {
272
+ try {
273
+ const input = normalize_job_id_payload(payload);
274
+ const result = this.read_job_result
275
+ ? await this.read_job_result(input)
276
+ : this.serialize_local_result(this.read_local_job(input.job_id));
277
+ if (result.status === "succeeded" && result.result) {
278
+ return {
279
+ success: true,
280
+ data: result.result,
281
+ message: result.message || "image job succeeded",
282
+ };
283
+ }
284
+ if (result.status === "failed") {
285
+ return {
286
+ success: false,
287
+ data: result,
288
+ error: result.error || result.message || "image job failed",
289
+ message: result.message || "image job failed",
290
+ };
291
+ }
292
+ return {
293
+ success: true,
294
+ data: result,
295
+ message: result.message || `image job ${result.status}`,
296
+ };
297
+ }
298
+ catch (error) {
299
+ return {
300
+ success: false,
301
+ error: String(error),
302
+ message: String(error),
303
+ };
304
+ }
305
+ },
306
+ },
87
307
  generate: {
88
308
  execute: async ({ payload }) => {
89
309
  try {
90
310
  const input = normalize_image_payload(payload);
91
- const message = normalize_image_result(await this.image(input));
311
+ const job = this.create_job
312
+ ? await this.create_job(input)
313
+ : this.create_local_job(input);
314
+ const message = await this.wait_for_job(job.job_id);
92
315
  return {
93
316
  success: true,
94
317
  data: message,
@@ -1 +1 @@
1
- {"version":3,"file":"ImagePlugin.js","sourceRoot":"","sources":["../../../src/plugin/core/ImagePlugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ImagePlugin.js","sourceRoot":"","sources":["../../../src/plugin/core/ImagePlugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Linux Bubblewrap sandbox backend。
3
+ *
4
+ * 关键点(中文)
5
+ * - 基于 `bwrap` 提供 Linux 本机 shell sandbox。
6
+ * - 继续保持“shell 命令必须进入 sandbox”的安全语义,不提供宿主机裸跑回退。
7
+ * - 边界与 macOS backend 对齐:路径、环境变量、网络、隔离 HOME/TMPDIR。
8
+ */
9
+ import type { SandboxSpawnParams, SandboxSpawnResult } from "../sandbox/types/SandboxRuntime.js";
10
+ export declare function buildLinuxBubblewrapArgs(params: SandboxSpawnParams & {
11
+ actualCwd: string;
12
+ shellHomeDir: string;
13
+ shellTmpDir: string;
14
+ }): string[];
15
+ /**
16
+ * 在 Linux bubblewrap sandbox 中启动 shell 子进程。
17
+ */
18
+ export declare function spawnLinuxBubblewrapSandbox(params: SandboxSpawnParams & {
19
+ actualCwd: string;
20
+ }): Promise<SandboxSpawnResult>;
21
+ //# sourceMappingURL=LinuxBubblewrapSandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinuxBubblewrapSandbox.d.ts","sourceRoot":"","sources":["../../src/sandbox/LinuxBubblewrapSandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,mCAAmC,CAAC;AAwG3C,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,EAAE,CA+DX;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,kBAAkB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GACjD,OAAO,CAAC,kBAAkB,CAAC,CAmC7B"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Linux Bubblewrap sandbox backend。
3
+ *
4
+ * 关键点(中文)
5
+ * - 基于 `bwrap` 提供 Linux 本机 shell sandbox。
6
+ * - 继续保持“shell 命令必须进入 sandbox”的安全语义,不提供宿主机裸跑回退。
7
+ * - 边界与 macOS backend 对齐:路径、环境变量、网络、隔离 HOME/TMPDIR。
8
+ */
9
+ import { spawn } from "node:child_process";
10
+ import path from "node:path";
11
+ import fs from "fs-extra";
12
+ const DEFAULT_PATH_VALUE = "/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin";
13
+ function dedupeExistingPaths(values) {
14
+ const seen = new Set();
15
+ const result = [];
16
+ for (const value of values) {
17
+ const normalized = path.resolve(String(value || "").trim());
18
+ if (!normalized || seen.has(normalized))
19
+ continue;
20
+ if (!fs.existsSync(normalized))
21
+ continue;
22
+ seen.add(normalized);
23
+ result.push(normalized);
24
+ }
25
+ return result;
26
+ }
27
+ function buildReadablePaths(params) {
28
+ return dedupeExistingPaths([
29
+ "/usr",
30
+ "/bin",
31
+ "/sbin",
32
+ "/lib",
33
+ "/lib64",
34
+ "/etc",
35
+ params.rootPath,
36
+ params.shellHomeDir,
37
+ params.shellTmpDir,
38
+ path.dirname(params.shellPath),
39
+ ]);
40
+ }
41
+ function buildWritablePaths(params) {
42
+ return dedupeExistingPaths([
43
+ ...params.config.writablePaths,
44
+ params.shellDir,
45
+ params.shellHomeDir,
46
+ params.shellTmpDir,
47
+ ]);
48
+ }
49
+ function isPathCoveredBy(paths, targetPath) {
50
+ const normalizedTarget = path.resolve(targetPath);
51
+ return paths.some((value) => {
52
+ const normalizedValue = path.resolve(value);
53
+ if (normalizedValue === normalizedTarget)
54
+ return true;
55
+ const relative = path.relative(normalizedValue, normalizedTarget);
56
+ return Boolean(relative) && !relative.startsWith("..") && !path.isAbsolute(relative);
57
+ });
58
+ }
59
+ function buildSandboxEnv(params) {
60
+ const env = {};
61
+ for (const key of params.config.envAllowlist) {
62
+ const value = params.baseEnv[key];
63
+ if (typeof value !== "string" || !value.trim())
64
+ continue;
65
+ env[key] = value;
66
+ }
67
+ for (const [key, value] of Object.entries(params.baseEnv)) {
68
+ if (!key.startsWith("DC_"))
69
+ continue;
70
+ if (typeof value !== "string" || !value.trim())
71
+ continue;
72
+ env[key] = value;
73
+ }
74
+ env.PATH = String(env.PATH || params.baseEnv.PATH || DEFAULT_PATH_VALUE);
75
+ env.HOME = params.shellHomeDir;
76
+ env.TMPDIR = params.shellTmpDir;
77
+ env.SHELL = params.shellPath;
78
+ return env;
79
+ }
80
+ function addReadOnlyBind(args, sourcePath) {
81
+ args.push("--ro-bind", sourcePath, sourcePath);
82
+ }
83
+ function addWritableBind(args, sourcePath) {
84
+ args.push("--bind", sourcePath, sourcePath);
85
+ }
86
+ function addParentDirs(args, targetPath, createdDirs) {
87
+ const parts = path.resolve(targetPath).split(path.sep).filter(Boolean);
88
+ let current = "";
89
+ for (let index = 0; index < parts.length - 1; index += 1) {
90
+ current = `${current}/${parts[index]}`;
91
+ if (createdDirs.has(current))
92
+ continue;
93
+ createdDirs.add(current);
94
+ args.push("--dir", current);
95
+ }
96
+ }
97
+ export function buildLinuxBubblewrapArgs(params) {
98
+ const readablePaths = buildReadablePaths({
99
+ rootPath: params.config.rootPath,
100
+ shellPath: params.shellPath,
101
+ shellHomeDir: params.shellHomeDir,
102
+ shellTmpDir: params.shellTmpDir,
103
+ });
104
+ const writablePaths = buildWritablePaths({
105
+ ...params,
106
+ shellHomeDir: params.shellHomeDir,
107
+ shellTmpDir: params.shellTmpDir,
108
+ });
109
+ const writableSet = new Set(writablePaths);
110
+ const createdDirs = new Set();
111
+ const mountedPaths = [];
112
+ const args = [
113
+ "--die-with-parent",
114
+ "--unshare-pid",
115
+ "--proc",
116
+ "/proc",
117
+ "--dev",
118
+ "/dev",
119
+ ];
120
+ if (params.config.networkMode === "off") {
121
+ args.push("--unshare-net");
122
+ }
123
+ for (const readablePath of readablePaths) {
124
+ if (writableSet.has(readablePath))
125
+ continue;
126
+ if (!isPathCoveredBy(mountedPaths, readablePath)) {
127
+ addParentDirs(args, readablePath, createdDirs);
128
+ }
129
+ addReadOnlyBind(args, readablePath);
130
+ mountedPaths.push(readablePath);
131
+ }
132
+ for (const writablePath of writablePaths) {
133
+ if (!isPathCoveredBy(mountedPaths, writablePath)) {
134
+ addParentDirs(args, writablePath, createdDirs);
135
+ }
136
+ addWritableBind(args, writablePath);
137
+ mountedPaths.push(writablePath);
138
+ }
139
+ if (!isPathCoveredBy(readablePaths, params.actualCwd) &&
140
+ !isPathCoveredBy(writablePaths, params.actualCwd)) {
141
+ if (!isPathCoveredBy(mountedPaths, params.actualCwd)) {
142
+ addParentDirs(args, params.actualCwd, createdDirs);
143
+ }
144
+ addReadOnlyBind(args, params.actualCwd);
145
+ }
146
+ args.push("--chdir", params.actualCwd, params.shellPath, params.login ? "-lc" : "-c", params.cmd);
147
+ return args;
148
+ }
149
+ /**
150
+ * 在 Linux bubblewrap sandbox 中启动 shell 子进程。
151
+ */
152
+ export async function spawnLinuxBubblewrapSandbox(params) {
153
+ const sandboxRootDir = path.join(params.shellDir, "sandbox");
154
+ const shellHomeDir = path.join(sandboxRootDir, "home");
155
+ const shellTmpDir = path.join(sandboxRootDir, "tmp");
156
+ await fs.ensureDir(shellHomeDir);
157
+ await fs.ensureDir(shellTmpDir);
158
+ for (const writablePath of params.config.writablePaths) {
159
+ await fs.ensureDir(writablePath);
160
+ }
161
+ const child = spawn("bwrap", buildLinuxBubblewrapArgs({
162
+ ...params,
163
+ shellHomeDir,
164
+ shellTmpDir,
165
+ }), {
166
+ cwd: params.actualCwd,
167
+ stdio: "pipe",
168
+ env: buildSandboxEnv({
169
+ ...params,
170
+ shellHomeDir,
171
+ shellTmpDir,
172
+ }),
173
+ });
174
+ child.stdout.setEncoding("utf8");
175
+ child.stderr.setEncoding("utf8");
176
+ return {
177
+ child,
178
+ cwd: params.actualCwd,
179
+ sandboxed: true,
180
+ backend: "linux-bubblewrap",
181
+ networkMode: params.config.networkMode,
182
+ };
183
+ }
184
+ //# sourceMappingURL=LinuxBubblewrapSandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinuxBubblewrapSandbox.js","sourceRoot":"","sources":["../../src/sandbox/LinuxBubblewrapSandbox.ts"],"names":[],"mappings":"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"}
@@ -7,11 +7,16 @@
7
7
  * - 解析结果只回答一个问题:这次命令执行的 sandbox 边界是什么。
8
8
  */
9
9
  import type { AgentContext } from "../types/runtime/agent/AgentContext.js";
10
+ import type { SandboxBackend } from "../sandbox/types/SandboxRuntime.js";
10
11
  import type { ResolvedSandboxConfig } from "../sandbox/types/SandboxRuntime.js";
11
12
  /**
12
13
  * 判断目标路径是否位于根目录内,或与根目录本身相同。
13
14
  */
14
15
  export declare function isPathInsideRoot(rootPath: string, targetPath: string): boolean;
16
+ /**
17
+ * 根据宿主平台解析当前 sandbox backend。
18
+ */
19
+ export declare function resolveSandboxBackend(): SandboxBackend;
15
20
  /**
16
21
  * 解析当前请求最终使用的 sandbox 配置。
17
22
  */