downcity 1.1.90 → 1.1.94

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 (67) hide show
  1. package/package.json +4 -4
  2. package/town/agent/control/CommonHelpers.d.ts +36 -0
  3. package/town/agent/control/CommonHelpers.d.ts.map +1 -0
  4. package/town/agent/control/CommonHelpers.js +63 -0
  5. package/town/agent/control/CommonHelpers.js.map +1 -0
  6. package/town/agent/control/ExecuteBySession.d.ts +28 -0
  7. package/town/agent/control/ExecuteBySession.d.ts.map +1 -0
  8. package/town/agent/control/ExecuteBySession.js +41 -0
  9. package/town/agent/control/ExecuteBySession.js.map +1 -0
  10. package/town/agent/control/ExecuteInput.d.ts +18 -0
  11. package/town/agent/control/ExecuteInput.d.ts.map +1 -0
  12. package/town/agent/control/ExecuteInput.js +201 -0
  13. package/town/agent/control/ExecuteInput.js.map +1 -0
  14. package/town/agent/control/Helpers.d.ts +13 -0
  15. package/town/agent/control/Helpers.d.ts.map +1 -0
  16. package/town/agent/control/Helpers.js +13 -0
  17. package/town/agent/control/Helpers.js.map +1 -0
  18. package/town/agent/control/MessageTimeline.d.ts +22 -0
  19. package/town/agent/control/MessageTimeline.d.ts.map +1 -0
  20. package/town/agent/control/MessageTimeline.js +226 -0
  21. package/town/agent/control/MessageTimeline.js.map +1 -0
  22. package/town/agent/control/SessionSummaryStore.d.ts +18 -0
  23. package/town/agent/control/SessionSummaryStore.d.ts.map +1 -0
  24. package/town/agent/control/SessionSummaryStore.js +50 -0
  25. package/town/agent/control/SessionSummaryStore.js.map +1 -0
  26. package/town/agent/control/TaskStore.d.ts +33 -0
  27. package/town/agent/control/TaskStore.d.ts.map +1 -0
  28. package/town/agent/control/TaskStore.js +175 -0
  29. package/town/agent/control/TaskStore.js.map +1 -0
  30. package/town/agent/control/types/ControlSessionExecute.d.ts +85 -0
  31. package/town/agent/control/types/ControlSessionExecute.d.ts.map +1 -0
  32. package/town/agent/control/types/ControlSessionExecute.js +9 -0
  33. package/town/agent/control/types/ControlSessionExecute.js.map +1 -0
  34. package/town/agent/control/types/ControlViewData.d.ts +320 -0
  35. package/town/agent/control/types/ControlViewData.d.ts.map +1 -0
  36. package/town/agent/control/types/ControlViewData.js +9 -0
  37. package/town/agent/control/types/ControlViewData.js.map +1 -0
  38. package/town/agent/http/control/ControlAuthorizationRoutes.d.ts +1 -1
  39. package/town/agent/http/control/ControlAuthorizationRoutes.d.ts.map +1 -1
  40. package/town/agent/http/control/ControlAuthorizationRoutes.js +51 -10
  41. package/town/agent/http/control/ControlAuthorizationRoutes.js.map +1 -1
  42. package/town/agent/http/control/OverviewRoutes.d.ts.map +1 -1
  43. package/town/agent/http/control/OverviewRoutes.js +2 -3
  44. package/town/agent/http/control/OverviewRoutes.js.map +1 -1
  45. package/town/agent/http/control/SessionRoutes.d.ts.map +1 -1
  46. package/town/agent/http/control/SessionRoutes.js +4 -6
  47. package/town/agent/http/control/SessionRoutes.js.map +1 -1
  48. package/town/agent/http/control/TaskRoutes.js +3 -3
  49. package/town/agent/http/control/TaskRoutes.js.map +1 -1
  50. package/town/agent/http/static/static.js +1 -1
  51. package/town/agent/http/static/static.js.map +1 -1
  52. package/town/config/Paths.d.ts +21 -0
  53. package/town/config/Paths.d.ts.map +1 -1
  54. package/town/config/Paths.js +31 -1
  55. package/town/config/Paths.js.map +1 -1
  56. package/town/control/DashboardOverviewApiRoutes.js +1 -1
  57. package/town/control/DashboardOverviewApiRoutes.js.map +1 -1
  58. package/town/control/DashboardRuntimeApiRoutes.d.ts.map +1 -1
  59. package/town/control/DashboardRuntimeApiRoutes.js +51 -8
  60. package/town/control/DashboardRuntimeApiRoutes.js.map +1 -1
  61. package/town/control/DashboardSessionApiRoutes.d.ts.map +1 -1
  62. package/town/control/DashboardSessionApiRoutes.js +76 -2
  63. package/town/control/DashboardSessionApiRoutes.js.map +1 -1
  64. package/town/control/DashboardTaskApiRoutes.js +1 -1
  65. package/town/control/DashboardTaskApiRoutes.js.map +1 -1
  66. package/town/shared/Plugins.js +2 -2
  67. package/town/shared/Plugins.js.map +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "downcity",
3
- "version": "1.1.90",
3
+ "version": "1.1.94",
4
4
  "type": "module",
5
5
  "description": "Downcity CLI bundle — installs city and town commands",
6
6
  "bin": {
@@ -45,9 +45,9 @@
45
45
  "prompts": "^2.4.2",
46
46
  "ws": "^8.21.0",
47
47
  "zod": "^4.4.3",
48
- "@downcity/agent": "^1.1.74",
49
- "@downcity/city": "^0.2.36",
50
- "@downcity/plugins": "^1.0.30"
48
+ "@downcity/agent": "^1.1.79",
49
+ "@downcity/city": "^0.2.40",
50
+ "@downcity/plugins": "^1.0.34"
51
51
  },
52
52
  "scripts": {
53
53
  "build": "node scripts/copy-cli-products.mjs && node scripts/ensure-cli-executable.mjs",
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 单 agent control API 通用 helper。
3
+ *
4
+ * 关键点(中文)
5
+ * - 聚合 control 路由、query/path/文本裁剪等基础工具。
6
+ * - 单 agent 控制面统一收敛到 `/api/control/*`。
7
+ * - 不依赖任何业务状态。
8
+ */
9
+ /**
10
+ * 单 agent control API 的公开路由前缀。
11
+ *
12
+ * 说明(中文)
13
+ * - 单 agent 控制面只暴露 `/api/control/*`。
14
+ */
15
+ export declare const CONTROL_API_ROUTE_PREFIXES: readonly ["/api/control"];
16
+ /**
17
+ * 为同一个 control 端点生成公开路径别名。
18
+ */
19
+ export declare function buildControlRouteAliases(suffix: string): string[];
20
+ /**
21
+ * 解析 limit 参数并做边界裁剪。
22
+ */
23
+ export declare function toLimit(raw: string | undefined, fallback?: number): number;
24
+ /**
25
+ * 转成可选字符串。
26
+ */
27
+ export declare function toOptionalString(input: unknown): string | undefined;
28
+ /**
29
+ * 安全 decodeURIComponent。
30
+ */
31
+ export declare function decodeMaybe(value: string): string;
32
+ /**
33
+ * 文本截断。
34
+ */
35
+ export declare function truncateText(text: string, maxChars: number): string;
36
+ //# sourceMappingURL=CommonHelpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommonHelpers.d.ts","sourceRoot":"","sources":["../../../src/agent/control/CommonHelpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,2BAA4B,CAAC;AAEpE;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAKjE;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,QAAQ,SAAgB,GACvB,MAAM,CAIR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGnE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAInE"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * 单 agent control API 通用 helper。
3
+ *
4
+ * 关键点(中文)
5
+ * - 聚合 control 路由、query/path/文本裁剪等基础工具。
6
+ * - 单 agent 控制面统一收敛到 `/api/control/*`。
7
+ * - 不依赖任何业务状态。
8
+ */
9
+ const DEFAULT_LIMIT = 50;
10
+ const MAX_LIMIT = 500;
11
+ /**
12
+ * 单 agent control API 的公开路由前缀。
13
+ *
14
+ * 说明(中文)
15
+ * - 单 agent 控制面只暴露 `/api/control/*`。
16
+ */
17
+ export const CONTROL_API_ROUTE_PREFIXES = ["/api/control"];
18
+ /**
19
+ * 为同一个 control 端点生成公开路径别名。
20
+ */
21
+ export function buildControlRouteAliases(suffix) {
22
+ const normalizedSuffix = String(suffix || "").startsWith("/")
23
+ ? String(suffix || "")
24
+ : `/${String(suffix || "")}`;
25
+ return CONTROL_API_ROUTE_PREFIXES.map((prefix) => `${prefix}${normalizedSuffix}`);
26
+ }
27
+ /**
28
+ * 解析 limit 参数并做边界裁剪。
29
+ */
30
+ export function toLimit(raw, fallback = DEFAULT_LIMIT) {
31
+ const n = Number.parseInt(String(raw || "").trim(), 10);
32
+ if (!Number.isFinite(n) || Number.isNaN(n))
33
+ return fallback;
34
+ return Math.max(1, Math.min(MAX_LIMIT, n));
35
+ }
36
+ /**
37
+ * 转成可选字符串。
38
+ */
39
+ export function toOptionalString(input) {
40
+ const value = typeof input === "string" ? input.trim() : "";
41
+ return value ? value : undefined;
42
+ }
43
+ /**
44
+ * 安全 decodeURIComponent。
45
+ */
46
+ export function decodeMaybe(value) {
47
+ try {
48
+ return decodeURIComponent(String(value || ""));
49
+ }
50
+ catch {
51
+ return String(value || "");
52
+ }
53
+ }
54
+ /**
55
+ * 文本截断。
56
+ */
57
+ export function truncateText(text, maxChars) {
58
+ const normalized = String(text || "");
59
+ if (normalized.length <= maxChars)
60
+ return normalized;
61
+ return normalized.slice(0, Math.max(0, maxChars - 3)) + "...";
62
+ }
63
+ //# sourceMappingURL=CommonHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommonHelpers.js","sourceRoot":"","sources":["../../../src/agent/control/CommonHelpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,cAAc,CAAU,CAAC;AAEpE;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAc;IACrD,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAC3D,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QACtB,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;IAC/B,OAAO,0BAA0B,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,gBAAgB,EAAE,CAAC,CAAC;AACpF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CACrB,GAAuB,EACvB,QAAQ,GAAG,aAAa;IAExB,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC5D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,QAAgB;IACzD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACtC,IAAI,UAAU,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,UAAU,CAAC;IACrD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAChE,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Control execute by session helper。
3
+ *
4
+ * 关键点(中文)
5
+ * - control 层只负责把请求转成 session prompt。
6
+ * - chat / queue 等渠道语义由宿主显式注入的 plugin 自行实现。
7
+ */
8
+ import type { AgentRuntime } from "@downcity/agent/internal/types/runtime/agent/AgentRuntime.js";
9
+ import type { ControlSessionExecuteAttachmentInput } from "../../agent/control/types/ControlSessionExecute.js";
10
+ /**
11
+ * 在指定 session 中执行一轮请求。
12
+ *
13
+ * 说明(中文)
14
+ * - 按普通 session 同步执行。
15
+ */
16
+ export declare function executeBySessionId(params: {
17
+ agentState: AgentRuntime;
18
+ sessionId: string;
19
+ instructions: string;
20
+ attachments?: ControlSessionExecuteAttachmentInput[];
21
+ }): Promise<{
22
+ assistantMessage: import("@downcity/agent/internal/executor/types/SessionMessages.js").SessionMessageV1 | undefined;
23
+ userVisible: string;
24
+ queued: boolean;
25
+ error?: string | undefined;
26
+ success: boolean;
27
+ }>;
28
+ //# sourceMappingURL=ExecuteBySession.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecuteBySession.d.ts","sourceRoot":"","sources":["../../../src/agent/control/ExecuteBySession.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8DAA8D,CAAC;AACjG,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,gDAAgD,CAAC;AAG3G;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,UAAU,EAAE,YAAY,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,oCAAoC,EAAE,CAAC;CACtD;;;;;;GA0BA"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Control execute by session helper。
3
+ *
4
+ * 关键点(中文)
5
+ * - control 层只负责把请求转成 session prompt。
6
+ * - chat / queue 等渠道语义由宿主显式注入的 plugin 自行实现。
7
+ */
8
+ import { buildExecuteInputText } from "./ExecuteInput.js";
9
+ /**
10
+ * 在指定 session 中执行一轮请求。
11
+ *
12
+ * 说明(中文)
13
+ * - 按普通 session 同步执行。
14
+ */
15
+ export async function executeBySessionId(params) {
16
+ const sessionId = String(params.sessionId || "").trim();
17
+ const instructions = String(params.instructions || "").trim();
18
+ if (!sessionId)
19
+ throw new Error("Missing sessionId");
20
+ if (!instructions)
21
+ throw new Error("Missing instructions");
22
+ const executeInput = await buildExecuteInputText({
23
+ projectRoot: params.agentState.rootPath,
24
+ sessionId,
25
+ instructions,
26
+ attachments: params.attachments,
27
+ });
28
+ const session = params.agentState.getSession(sessionId);
29
+ const turn = await session.prompt({
30
+ query: executeInput,
31
+ });
32
+ const result = await turn.finished;
33
+ return {
34
+ success: result.success,
35
+ ...(result.error ? { error: result.error } : {}),
36
+ assistantMessage: result.assistantMessage,
37
+ userVisible: result.text.trim(),
38
+ queued: false,
39
+ };
40
+ }
41
+ //# sourceMappingURL=ExecuteBySession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecuteBySession.js","sourceRoot":"","sources":["../../../src/agent/control/ExecuteBySession.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAKxC;IACC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACrD,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAE3D,MAAM,YAAY,GAAG,MAAM,qBAAqB,CAAC;QAC/C,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ;QACvC,SAAS;QACT,YAAY;QACZ,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC;QAChC,KAAK,EAAE,YAAY;KACpB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC;IAEnC,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;QAC/B,MAAM,EAAE,KAAK;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Control execute 输入拼装 helper。
3
+ *
4
+ * 关键点(中文)
5
+ * - 负责把 API 传入的附件规范化并落盘。
6
+ * - 最终统一转成 `<file>` 标签注入到 user message。
7
+ */
8
+ import type { ControlSessionExecuteAttachmentInput } from "../../agent/control/types/ControlSessionExecute.js";
9
+ /**
10
+ * 构造 execute 入站文本。
11
+ */
12
+ export declare function buildExecuteInputText(params: {
13
+ projectRoot: string;
14
+ sessionId: string;
15
+ instructions: string;
16
+ attachments?: ControlSessionExecuteAttachmentInput[];
17
+ }): Promise<string>;
18
+ //# sourceMappingURL=ExecuteInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecuteInput.d.ts","sourceRoot":"","sources":["../../../src/agent/control/ExecuteInput.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EACV,oCAAoC,EAErC,MAAM,gDAAgD,CAAC;AA0KxD;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,oCAAoC,EAAE,CAAC;CACtD,GAAG,OAAO,CAAC,MAAM,CAAC,CA0ClB"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Control execute 输入拼装 helper。
3
+ *
4
+ * 关键点(中文)
5
+ * - 负责把 API 传入的附件规范化并落盘。
6
+ * - 最终统一转成 `<file>` 标签注入到 user message。
7
+ */
8
+ import fs from "fs-extra";
9
+ import path from "node:path";
10
+ import { getCacheDirPath } from "../../config/Paths.js";
11
+ import { renderChatMessageFileTag } from "@downcity/agent/internal/executor/messages/ChatMessageMarkup.js";
12
+ const EXECUTE_ATTACHMENT_MAX_COUNT = 8;
13
+ const EXECUTE_ATTACHMENT_MAX_BYTES = 2 * 1024 * 1024;
14
+ const EXECUTE_ATTACHMENT_CONTENT_MAX_CHARS = 1_500_000;
15
+ const EXECUTE_ATTACHMENT_FALLBACK_TEXT = "请查看以上附件并按用户要求处理。";
16
+ function normalizeExecuteAttachmentType(value) {
17
+ const raw = String(value || "")
18
+ .trim()
19
+ .toLowerCase();
20
+ if (raw === "photo" ||
21
+ raw === "voice" ||
22
+ raw === "audio" ||
23
+ raw === "video") {
24
+ return raw;
25
+ }
26
+ return "document";
27
+ }
28
+ function normalizeAttachmentCaption(value) {
29
+ const text = String(value || "")
30
+ .replace(/\r?\n+/g, " ")
31
+ .replace(/\s+/g, " ")
32
+ .replace(/\|/g, "/")
33
+ .trim();
34
+ if (!text)
35
+ return undefined;
36
+ return text.slice(0, 180);
37
+ }
38
+ function toProjectRelativePath(projectRoot, absPath) {
39
+ const relative = path.relative(projectRoot, absPath);
40
+ if (!relative)
41
+ return null;
42
+ if (relative.startsWith(".."))
43
+ return null;
44
+ if (path.isAbsolute(relative))
45
+ return null;
46
+ return relative.split(path.sep).join("/");
47
+ }
48
+ function normalizeAttachmentFileName(params) {
49
+ const raw = String(params.fileName || "").trim();
50
+ const base = (raw || "attachment")
51
+ .replace(/[\\/:*?"<>|]/g, "-")
52
+ .replace(/\s+/g, "-")
53
+ .replace(/-+/g, "-")
54
+ .replace(/^\.+/, "")
55
+ .replace(/^-+|-+$/g, "")
56
+ .slice(0, 72);
57
+ const safeBase = base || "attachment";
58
+ const fallbackExt = params.fallbackExt.startsWith(".")
59
+ ? params.fallbackExt
60
+ : `.${params.fallbackExt}`;
61
+ const hasExt = /\.[A-Za-z0-9]+$/.test(safeBase);
62
+ return hasExt ? safeBase : `${safeBase}${fallbackExt}`;
63
+ }
64
+ function inferAttachmentExt(params) {
65
+ const fromFileName = path.extname(String(params.fileName || "").trim())
66
+ .toLowerCase()
67
+ .trim();
68
+ if (fromFileName)
69
+ return fromFileName;
70
+ const contentType = String(params.contentType || "").toLowerCase();
71
+ if (contentType.includes("markdown"))
72
+ return ".md";
73
+ if (contentType.includes("json"))
74
+ return ".json";
75
+ if (contentType.includes("html"))
76
+ return ".html";
77
+ if (contentType.includes("plain"))
78
+ return ".txt";
79
+ if (params.type === "photo")
80
+ return ".jpg";
81
+ if (params.type === "voice" || params.type === "audio")
82
+ return ".mp3";
83
+ if (params.type === "video")
84
+ return ".mp4";
85
+ return ".md";
86
+ }
87
+ async function resolveAttachmentPathFromInput(params) {
88
+ const rawPath = String(params.attachment.path || "").trim();
89
+ if (!rawPath)
90
+ return null;
91
+ const abs = path.isAbsolute(rawPath)
92
+ ? path.normalize(rawPath)
93
+ : path.resolve(params.projectRoot, rawPath);
94
+ const relative = toProjectRelativePath(params.projectRoot, abs);
95
+ if (!relative)
96
+ return null;
97
+ const stat = await fs
98
+ .stat(abs)
99
+ .then((value) => value)
100
+ .catch(() => null);
101
+ if (!stat?.isFile())
102
+ return null;
103
+ return relative;
104
+ }
105
+ function resolveAttachmentBytes(attachment) {
106
+ const textContent = typeof attachment.content === "string" ? attachment.content : "";
107
+ if (textContent) {
108
+ const clipped = textContent.slice(0, EXECUTE_ATTACHMENT_CONTENT_MAX_CHARS);
109
+ return Buffer.from(clipped, "utf8");
110
+ }
111
+ const base64 = String(attachment.contentBase64 || "").trim();
112
+ if (!base64)
113
+ return null;
114
+ try {
115
+ return Buffer.from(base64, "base64");
116
+ }
117
+ catch {
118
+ return null;
119
+ }
120
+ }
121
+ async function materializeAttachmentContent(params) {
122
+ const bytes = resolveAttachmentBytes(params.attachment);
123
+ if (!bytes || bytes.length <= 0)
124
+ return null;
125
+ if (bytes.length > EXECUTE_ATTACHMENT_MAX_BYTES) {
126
+ throw new Error(`Attachment too large (>${EXECUTE_ATTACHMENT_MAX_BYTES} bytes)`);
127
+ }
128
+ const type = normalizeExecuteAttachmentType(params.attachment.type);
129
+ const ext = inferAttachmentExt({
130
+ type,
131
+ fileName: params.attachment.fileName,
132
+ contentType: params.attachment.contentType,
133
+ });
134
+ const safeName = normalizeAttachmentFileName({
135
+ fileName: params.attachment.fileName,
136
+ fallbackExt: ext,
137
+ });
138
+ const safeContext = String(params.sessionId || "session")
139
+ .replace(/[^A-Za-z0-9_-]+/g, "-")
140
+ .replace(/-+/g, "-")
141
+ .replace(/^-+|-+$/g, "")
142
+ .slice(0, 32);
143
+ const prefix = safeContext || "context";
144
+ const fileName = `${Date.now()}-${prefix}-${String(params.index + 1).padStart(2, "0")}-${safeName}`;
145
+ const cacheDir = path.join(getCacheDirPath(params.projectRoot), "chrome-extension");
146
+ await fs.ensureDir(cacheDir);
147
+ const absPath = path.join(cacheDir, fileName);
148
+ await fs.writeFile(absPath, bytes);
149
+ return toProjectRelativePath(params.projectRoot, absPath);
150
+ }
151
+ function toAttachmentLine(params) {
152
+ return renderChatMessageFileTag({
153
+ type: params.type,
154
+ path: params.relativePath,
155
+ ...(params.caption ? { caption: params.caption } : {}),
156
+ });
157
+ }
158
+ /**
159
+ * 构造 execute 入站文本。
160
+ */
161
+ export async function buildExecuteInputText(params) {
162
+ const instructions = String(params.instructions || "").trim();
163
+ const inputAttachments = Array.isArray(params.attachments)
164
+ ? params.attachments.slice(0, EXECUTE_ATTACHMENT_MAX_COUNT)
165
+ : [];
166
+ if (inputAttachments.length === 0)
167
+ return instructions;
168
+ const lines = [];
169
+ for (let index = 0; index < inputAttachments.length; index += 1) {
170
+ const attachment = inputAttachments[index];
171
+ if (!attachment || typeof attachment !== "object")
172
+ continue;
173
+ const type = normalizeExecuteAttachmentType(attachment.type);
174
+ const caption = normalizeAttachmentCaption(attachment.caption);
175
+ const reusePath = await resolveAttachmentPathFromInput({
176
+ projectRoot: params.projectRoot,
177
+ attachment,
178
+ });
179
+ const relativePath = reusePath ||
180
+ (await materializeAttachmentContent({
181
+ projectRoot: params.projectRoot,
182
+ sessionId: params.sessionId,
183
+ attachment,
184
+ index,
185
+ }));
186
+ if (!relativePath)
187
+ continue;
188
+ lines.push(toAttachmentLine({
189
+ type,
190
+ relativePath,
191
+ ...(caption ? { caption } : {}),
192
+ }));
193
+ }
194
+ if (lines.length === 0)
195
+ return instructions;
196
+ return [lines.join("\n"), instructions || EXECUTE_ATTACHMENT_FALLBACK_TEXT]
197
+ .filter(Boolean)
198
+ .join("\n\n")
199
+ .trim();
200
+ }
201
+ //# sourceMappingURL=ExecuteInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecuteInput.js","sourceRoot":"","sources":["../../../src/agent/control/ExecuteInput.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Control helper 聚合出口。
3
+ *
4
+ * 关键点(中文)
5
+ * - 兼容控制面路由层的统一 import 路径。
6
+ * - 具体实现已拆分到独立子模块,避免单文件继续膨胀。
7
+ */
8
+ export { toLimit, toOptionalString, decodeMaybe } from "./CommonHelpers.js";
9
+ export { buildExecuteInputText } from "./ExecuteInput.js";
10
+ export { loadSessionMessagesFromFile, resolveUiMessagePreview, toUiMessageTimeline, } from "./MessageTimeline.js";
11
+ export { listControlSessionSummaries } from "./SessionSummaryStore.js";
12
+ export { TASK_RUN_DIR_REGEX, listTaskRuns, readRecentLogs, readTaskRunDetail, } from "./TaskStore.js";
13
+ //# sourceMappingURL=Helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Helpers.d.ts","sourceRoot":"","sources":["../../../src/agent/control/Helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EACL,2BAA2B,EAC3B,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,iBAAiB,GAClB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Control helper 聚合出口。
3
+ *
4
+ * 关键点(中文)
5
+ * - 兼容控制面路由层的统一 import 路径。
6
+ * - 具体实现已拆分到独立子模块,避免单文件继续膨胀。
7
+ */
8
+ export { toLimit, toOptionalString, decodeMaybe } from "./CommonHelpers.js";
9
+ export { buildExecuteInputText } from "./ExecuteInput.js";
10
+ export { loadSessionMessagesFromFile, resolveUiMessagePreview, toUiMessageTimeline, } from "./MessageTimeline.js";
11
+ export { listControlSessionSummaries } from "./SessionSummaryStore.js";
12
+ export { TASK_RUN_DIR_REGEX, listTaskRuns, readRecentLogs, readTaskRunDetail, } from "./TaskStore.js";
13
+ //# sourceMappingURL=Helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Helpers.js","sourceRoot":"","sources":["../../../src/agent/control/Helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EACL,2BAA2B,EAC3B,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,iBAAiB,GAClB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Control 消息时间线 helper。
3
+ *
4
+ * 关键点(中文)
5
+ * - 负责把上下文消息映射成 control UI 可视时间线。
6
+ * - 同时提供消息文件读取能力。
7
+ */
8
+ import type { SessionMessageV1 } from "@downcity/agent/internal/executor/types/SessionMessages.js";
9
+ import type { ControlTimelineEvent } from "../../agent/control/types/ControlViewData.js";
10
+ /**
11
+ * 转成 control 时间线。
12
+ */
13
+ export declare function toUiMessageTimeline(message: SessionMessageV1): ControlTimelineEvent[];
14
+ /**
15
+ * 读取 session 消息文件。
16
+ */
17
+ export declare function loadSessionMessagesFromFile(filePath: string): Promise<SessionMessageV1[]>;
18
+ /**
19
+ * 读取适合摘要展示的消息预览文本。
20
+ */
21
+ export declare function resolveUiMessagePreview(message: SessionMessageV1): string;
22
+ //# sourceMappingURL=MessageTimeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageTimeline.d.ts","sourceRoot":"","sources":["../../../src/agent/control/MessageTimeline.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACV,gBAAgB,EAEjB,MAAM,4DAA4D,CAAC;AAGpE,OAAO,KAAK,EAAE,oBAAoB,EAAuB,MAAM,0CAA0C,CAAC;AAmI1G;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,gBAAgB,GACxB,oBAAoB,EAAE,CAiFxB;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAgB7B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAEzE"}