@caupulican/pi-adaptative 0.80.16 → 0.80.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.80.17] - 2026-06-07
4
+
5
+ ### Fixed
6
+
7
+ - Added background script result aliases from job id and name, so follow-up status/log calls reuse the original start panel even when the job's generated id differs from the friendly start name.
8
+
3
9
  ## [0.80.16] - 2026-06-07
4
10
 
5
11
  ### Fixed
@@ -6,6 +6,7 @@ export interface ToolPanelTenantScope {
6
6
  }
7
7
  export declare function createToolPanelTenantKey(scope: ToolPanelTenantScope): string;
8
8
  export declare function getToolPanelActionKey(scope: ToolPanelTenantScope, toolName: string, args: unknown): string | undefined;
9
+ export declare function getToolPanelResultActionKeys(scope: ToolPanelTenantScope, toolName: string, result: unknown): string[];
9
10
  export declare function shouldReuseToolPanelInPlace(toolName: string, args: unknown): boolean;
10
11
  export declare class ToolPanelRegistry {
11
12
  private readonly panelsByAction;
@@ -16,6 +17,7 @@ export declare class ToolPanelRegistry {
16
17
  }): ToolExecutionComponent | undefined;
17
18
  replaceActiveForAction(toolCallId: string, panel: ToolExecutionComponent, actionKey: string): void;
18
19
  register(toolCallId: string, panel: ToolExecutionComponent, actionKey?: string): void;
20
+ registerAliases(panel: ToolExecutionComponent, actionKeys: string[]): void;
19
21
  hasActive(toolCallId: string): boolean;
20
22
  getActive(toolCallId: string): ToolExecutionComponent | undefined;
21
23
  activeEntries(): IterableIterator<[string, ToolExecutionComponent]>;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-panel-registry.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-panel-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,WAAW,oBAAoB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAE5E;AAWD,wBAAgB,qBAAqB,CACpC,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,GACX,MAAM,GAAG,SAAS,CAgBpB;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAOpF;AAED,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6C;IAC5E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6C;IAC5E,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA6B;IAE/D,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,sBAAsB,GAAG,SAAS,CAKlH;IAED,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAOjG;IAED,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAMpF;IAED,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAErC;IAED,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAEhE;IAED,aAAa,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAElE;IAED,QAAQ,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAK/C;IAED,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAG/B;IAED,WAAW,IAAI,IAAI,CAGlB;IAED,QAAQ,IAAI,IAAI,CAIf;CACD","sourcesContent":["import type { ToolExecutionComponent } from \"./tool-execution.ts\";\n\nexport interface ToolPanelTenantScope {\n\tsessionId?: string;\n\tsessionFile?: string;\n\tcwd: string;\n}\n\nexport function createToolPanelTenantKey(scope: ToolPanelTenantScope): string {\n\treturn [scope.sessionId || \"no-session-id\", scope.sessionFile || \"no-session-file\", scope.cwd].join(\"\\0\");\n}\n\nfunction backgroundScriptSelector(record: Record<string, unknown>): string | undefined {\n\tconst action = String(record.action || \"list\");\n\tif (action === \"start\" && typeof record.name === \"string\" && record.name.trim()) return record.name.trim();\n\tif ([\"status\", \"logs\", \"stop\"].includes(action) && typeof record.id === \"string\" && record.id.trim()) {\n\t\treturn record.id.trim();\n\t}\n\treturn undefined;\n}\n\nexport function getToolPanelActionKey(\n\tscope: ToolPanelTenantScope,\n\ttoolName: string,\n\targs: unknown,\n): string | undefined {\n\tconst tenantKey = createToolPanelTenantKey(scope);\n\tif (!args || typeof args !== \"object\") return toolName.endsWith(\"_status\") ? `${tenantKey}\\0${toolName}` : undefined;\n\tconst record = args as Record<string, unknown>;\n\tconst pathValue = record.path ?? record.file_path;\n\tif ([\"read\", \"edit\", \"write\"].includes(toolName) && typeof pathValue === \"string\" && pathValue.trim()) {\n\t\treturn `${tenantKey}\\0${toolName}:${pathValue.trim()}`;\n\t}\n\tif (toolName === \"background_script\") {\n\t\tconst selector = backgroundScriptSelector(record);\n\t\treturn selector ? `${tenantKey}\\0${toolName}:${selector}` : undefined;\n\t}\n\tif (toolName.endsWith(\"_status\")) return `${tenantKey}\\0${toolName}`;\n\tif (toolName === \"learning_auto_learn_state\") return `${tenantKey}\\0${toolName}:${String(record.action || \"read\")}`;\n\tif (toolName === \"task_steps\") return `${tenantKey}\\0${toolName}:${String(record.action || \"list\")}`;\n\treturn undefined;\n}\n\nexport function shouldReuseToolPanelInPlace(toolName: string, args: unknown): boolean {\n\treturn (\n\t\ttoolName === \"background_script\" &&\n\t\t!!args &&\n\t\ttypeof args === \"object\" &&\n\t\t!!backgroundScriptSelector(args as Record<string, unknown>)\n\t);\n}\n\nexport class ToolPanelRegistry {\n\tprivate readonly panelsByAction = new Map<string, ToolExecutionComponent>();\n\tprivate readonly activeByCallId = new Map<string, ToolExecutionComponent>();\n\tprivate readonly actionKeyByCallId = new Map<string, string>();\n\n\tgetReusable(actionKey: string | undefined, options?: { allowActive?: boolean }): ToolExecutionComponent | undefined {\n\t\tif (!actionKey) return undefined;\n\t\tconst panel = this.panelsByAction.get(actionKey);\n\t\tif (!panel || (!options?.allowActive && this.isActive(panel))) return undefined;\n\t\treturn panel;\n\t}\n\n\treplaceActiveForAction(toolCallId: string, panel: ToolExecutionComponent, actionKey: string): void {\n\t\tfor (const [activeCallId, activeActionKey] of this.actionKeyByCallId.entries()) {\n\t\t\tif (activeActionKey !== actionKey) continue;\n\t\t\tthis.activeByCallId.delete(activeCallId);\n\t\t\tthis.actionKeyByCallId.delete(activeCallId);\n\t\t}\n\t\tthis.register(toolCallId, panel, actionKey);\n\t}\n\n\tregister(toolCallId: string, panel: ToolExecutionComponent, actionKey?: string): void {\n\t\tthis.activeByCallId.set(toolCallId, panel);\n\t\tif (actionKey) {\n\t\t\tthis.panelsByAction.set(actionKey, panel);\n\t\t\tthis.actionKeyByCallId.set(toolCallId, actionKey);\n\t\t}\n\t}\n\n\thasActive(toolCallId: string): boolean {\n\t\treturn this.activeByCallId.has(toolCallId);\n\t}\n\n\tgetActive(toolCallId: string): ToolExecutionComponent | undefined {\n\t\treturn this.activeByCallId.get(toolCallId);\n\t}\n\n\tactiveEntries(): IterableIterator<[string, ToolExecutionComponent]> {\n\t\treturn this.activeByCallId.entries();\n\t}\n\n\tisActive(panel: ToolExecutionComponent): boolean {\n\t\tfor (const active of this.activeByCallId.values()) {\n\t\t\tif (active === panel) return true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tfinish(toolCallId: string): void {\n\t\tthis.activeByCallId.delete(toolCallId);\n\t\tthis.actionKeyByCallId.delete(toolCallId);\n\t}\n\n\tclearActive(): void {\n\t\tthis.activeByCallId.clear();\n\t\tthis.actionKeyByCallId.clear();\n\t}\n\n\tclearAll(): void {\n\t\tthis.activeByCallId.clear();\n\t\tthis.panelsByAction.clear();\n\t\tthis.actionKeyByCallId.clear();\n\t}\n}\n"]}
1
+ {"version":3,"file":"tool-panel-registry.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-panel-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,WAAW,oBAAoB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAE5E;AA4BD,wBAAgB,qBAAqB,CACpC,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,GACX,MAAM,GAAG,SAAS,CAgBpB;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CAIrH;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAOpF;AAED,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6C;IAC5E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6C;IAC5E,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA6B;IAE/D,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,sBAAsB,GAAG,SAAS,CAKlH;IAED,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAOjG;IAED,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAMpF;IAED,eAAe,CAAC,KAAK,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAIzE;IAED,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAErC;IAED,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAEhE;IAED,aAAa,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAElE;IAED,QAAQ,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAK/C;IAED,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAG/B;IAED,WAAW,IAAI,IAAI,CAGlB;IAED,QAAQ,IAAI,IAAI,CAIf;CACD","sourcesContent":["import type { ToolExecutionComponent } from \"./tool-execution.ts\";\n\nexport interface ToolPanelTenantScope {\n\tsessionId?: string;\n\tsessionFile?: string;\n\tcwd: string;\n}\n\nexport function createToolPanelTenantKey(scope: ToolPanelTenantScope): string {\n\treturn [scope.sessionId || \"no-session-id\", scope.sessionFile || \"no-session-file\", scope.cwd].join(\"\\0\");\n}\n\nfunction backgroundScriptActionKey(tenantKey: string, selector: string): string {\n\treturn `${tenantKey}\\0background_script:${selector}`;\n}\n\nfunction backgroundScriptSelector(record: Record<string, unknown>): string | undefined {\n\tconst action = String(record.action || \"list\");\n\tif (action === \"start\" && typeof record.name === \"string\" && record.name.trim()) return record.name.trim();\n\tif ([\"status\", \"logs\", \"stop\"].includes(action) && typeof record.id === \"string\" && record.id.trim()) {\n\t\treturn record.id.trim();\n\t}\n\treturn undefined;\n}\n\nfunction backgroundScriptResultSelectors(result: unknown): string[] {\n\tif (!result || typeof result !== \"object\") return [];\n\tconst details = (result as Record<string, unknown>).details;\n\tif (!details || typeof details !== \"object\") return [];\n\tconst job = (details as Record<string, unknown>).job;\n\tif (!job || typeof job !== \"object\") return [];\n\tconst record = job as Record<string, unknown>;\n\tconst selectors = [record.id, record.name]\n\t\t.filter((value): value is string => typeof value === \"string\" && value.trim().length > 0)\n\t\t.map((value) => value.trim());\n\treturn [...new Set(selectors)];\n}\n\nexport function getToolPanelActionKey(\n\tscope: ToolPanelTenantScope,\n\ttoolName: string,\n\targs: unknown,\n): string | undefined {\n\tconst tenantKey = createToolPanelTenantKey(scope);\n\tif (!args || typeof args !== \"object\") return toolName.endsWith(\"_status\") ? `${tenantKey}\\0${toolName}` : undefined;\n\tconst record = args as Record<string, unknown>;\n\tconst pathValue = record.path ?? record.file_path;\n\tif ([\"read\", \"edit\", \"write\"].includes(toolName) && typeof pathValue === \"string\" && pathValue.trim()) {\n\t\treturn `${tenantKey}\\0${toolName}:${pathValue.trim()}`;\n\t}\n\tif (toolName === \"background_script\") {\n\t\tconst selector = backgroundScriptSelector(record);\n\t\treturn selector ? backgroundScriptActionKey(tenantKey, selector) : undefined;\n\t}\n\tif (toolName.endsWith(\"_status\")) return `${tenantKey}\\0${toolName}`;\n\tif (toolName === \"learning_auto_learn_state\") return `${tenantKey}\\0${toolName}:${String(record.action || \"read\")}`;\n\tif (toolName === \"task_steps\") return `${tenantKey}\\0${toolName}:${String(record.action || \"list\")}`;\n\treturn undefined;\n}\n\nexport function getToolPanelResultActionKeys(scope: ToolPanelTenantScope, toolName: string, result: unknown): string[] {\n\tif (toolName !== \"background_script\") return [];\n\tconst tenantKey = createToolPanelTenantKey(scope);\n\treturn backgroundScriptResultSelectors(result).map((selector) => backgroundScriptActionKey(tenantKey, selector));\n}\n\nexport function shouldReuseToolPanelInPlace(toolName: string, args: unknown): boolean {\n\treturn (\n\t\ttoolName === \"background_script\" &&\n\t\t!!args &&\n\t\ttypeof args === \"object\" &&\n\t\t!!backgroundScriptSelector(args as Record<string, unknown>)\n\t);\n}\n\nexport class ToolPanelRegistry {\n\tprivate readonly panelsByAction = new Map<string, ToolExecutionComponent>();\n\tprivate readonly activeByCallId = new Map<string, ToolExecutionComponent>();\n\tprivate readonly actionKeyByCallId = new Map<string, string>();\n\n\tgetReusable(actionKey: string | undefined, options?: { allowActive?: boolean }): ToolExecutionComponent | undefined {\n\t\tif (!actionKey) return undefined;\n\t\tconst panel = this.panelsByAction.get(actionKey);\n\t\tif (!panel || (!options?.allowActive && this.isActive(panel))) return undefined;\n\t\treturn panel;\n\t}\n\n\treplaceActiveForAction(toolCallId: string, panel: ToolExecutionComponent, actionKey: string): void {\n\t\tfor (const [activeCallId, activeActionKey] of this.actionKeyByCallId.entries()) {\n\t\t\tif (activeActionKey !== actionKey) continue;\n\t\t\tthis.activeByCallId.delete(activeCallId);\n\t\t\tthis.actionKeyByCallId.delete(activeCallId);\n\t\t}\n\t\tthis.register(toolCallId, panel, actionKey);\n\t}\n\n\tregister(toolCallId: string, panel: ToolExecutionComponent, actionKey?: string): void {\n\t\tthis.activeByCallId.set(toolCallId, panel);\n\t\tif (actionKey) {\n\t\t\tthis.panelsByAction.set(actionKey, panel);\n\t\t\tthis.actionKeyByCallId.set(toolCallId, actionKey);\n\t\t}\n\t}\n\n\tregisterAliases(panel: ToolExecutionComponent, actionKeys: string[]): void {\n\t\tfor (const actionKey of actionKeys) {\n\t\t\tthis.panelsByAction.set(actionKey, panel);\n\t\t}\n\t}\n\n\thasActive(toolCallId: string): boolean {\n\t\treturn this.activeByCallId.has(toolCallId);\n\t}\n\n\tgetActive(toolCallId: string): ToolExecutionComponent | undefined {\n\t\treturn this.activeByCallId.get(toolCallId);\n\t}\n\n\tactiveEntries(): IterableIterator<[string, ToolExecutionComponent]> {\n\t\treturn this.activeByCallId.entries();\n\t}\n\n\tisActive(panel: ToolExecutionComponent): boolean {\n\t\tfor (const active of this.activeByCallId.values()) {\n\t\t\tif (active === panel) return true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tfinish(toolCallId: string): void {\n\t\tthis.activeByCallId.delete(toolCallId);\n\t\tthis.actionKeyByCallId.delete(toolCallId);\n\t}\n\n\tclearActive(): void {\n\t\tthis.activeByCallId.clear();\n\t\tthis.actionKeyByCallId.clear();\n\t}\n\n\tclearAll(): void {\n\t\tthis.activeByCallId.clear();\n\t\tthis.panelsByAction.clear();\n\t\tthis.actionKeyByCallId.clear();\n\t}\n}\n"]}
@@ -1,6 +1,9 @@
1
1
  export function createToolPanelTenantKey(scope) {
2
2
  return [scope.sessionId || "no-session-id", scope.sessionFile || "no-session-file", scope.cwd].join("\0");
3
3
  }
4
+ function backgroundScriptActionKey(tenantKey, selector) {
5
+ return `${tenantKey}\0background_script:${selector}`;
6
+ }
4
7
  function backgroundScriptSelector(record) {
5
8
  const action = String(record.action || "list");
6
9
  if (action === "start" && typeof record.name === "string" && record.name.trim())
@@ -10,6 +13,21 @@ function backgroundScriptSelector(record) {
10
13
  }
11
14
  return undefined;
12
15
  }
16
+ function backgroundScriptResultSelectors(result) {
17
+ if (!result || typeof result !== "object")
18
+ return [];
19
+ const details = result.details;
20
+ if (!details || typeof details !== "object")
21
+ return [];
22
+ const job = details.job;
23
+ if (!job || typeof job !== "object")
24
+ return [];
25
+ const record = job;
26
+ const selectors = [record.id, record.name]
27
+ .filter((value) => typeof value === "string" && value.trim().length > 0)
28
+ .map((value) => value.trim());
29
+ return [...new Set(selectors)];
30
+ }
13
31
  export function getToolPanelActionKey(scope, toolName, args) {
14
32
  const tenantKey = createToolPanelTenantKey(scope);
15
33
  if (!args || typeof args !== "object")
@@ -21,7 +39,7 @@ export function getToolPanelActionKey(scope, toolName, args) {
21
39
  }
22
40
  if (toolName === "background_script") {
23
41
  const selector = backgroundScriptSelector(record);
24
- return selector ? `${tenantKey}\0${toolName}:${selector}` : undefined;
42
+ return selector ? backgroundScriptActionKey(tenantKey, selector) : undefined;
25
43
  }
26
44
  if (toolName.endsWith("_status"))
27
45
  return `${tenantKey}\0${toolName}`;
@@ -31,6 +49,12 @@ export function getToolPanelActionKey(scope, toolName, args) {
31
49
  return `${tenantKey}\0${toolName}:${String(record.action || "list")}`;
32
50
  return undefined;
33
51
  }
52
+ export function getToolPanelResultActionKeys(scope, toolName, result) {
53
+ if (toolName !== "background_script")
54
+ return [];
55
+ const tenantKey = createToolPanelTenantKey(scope);
56
+ return backgroundScriptResultSelectors(result).map((selector) => backgroundScriptActionKey(tenantKey, selector));
57
+ }
34
58
  export function shouldReuseToolPanelInPlace(toolName, args) {
35
59
  return (toolName === "background_script" &&
36
60
  !!args &&
@@ -65,6 +89,11 @@ export class ToolPanelRegistry {
65
89
  this.actionKeyByCallId.set(toolCallId, actionKey);
66
90
  }
67
91
  }
92
+ registerAliases(panel, actionKeys) {
93
+ for (const actionKey of actionKeys) {
94
+ this.panelsByAction.set(actionKey, panel);
95
+ }
96
+ }
68
97
  hasActive(toolCallId) {
69
98
  return this.activeByCallId.has(toolCallId);
70
99
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tool-panel-registry.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-panel-registry.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ToolExecutionComponent } from \"./tool-execution.ts\";\n\nexport interface ToolPanelTenantScope {\n\tsessionId?: string;\n\tsessionFile?: string;\n\tcwd: string;\n}\n\nexport function createToolPanelTenantKey(scope: ToolPanelTenantScope): string {\n\treturn [scope.sessionId || \"no-session-id\", scope.sessionFile || \"no-session-file\", scope.cwd].join(\"\\0\");\n}\n\nfunction backgroundScriptSelector(record: Record<string, unknown>): string | undefined {\n\tconst action = String(record.action || \"list\");\n\tif (action === \"start\" && typeof record.name === \"string\" && record.name.trim()) return record.name.trim();\n\tif ([\"status\", \"logs\", \"stop\"].includes(action) && typeof record.id === \"string\" && record.id.trim()) {\n\t\treturn record.id.trim();\n\t}\n\treturn undefined;\n}\n\nexport function getToolPanelActionKey(\n\tscope: ToolPanelTenantScope,\n\ttoolName: string,\n\targs: unknown,\n): string | undefined {\n\tconst tenantKey = createToolPanelTenantKey(scope);\n\tif (!args || typeof args !== \"object\") return toolName.endsWith(\"_status\") ? `${tenantKey}\\0${toolName}` : undefined;\n\tconst record = args as Record<string, unknown>;\n\tconst pathValue = record.path ?? record.file_path;\n\tif ([\"read\", \"edit\", \"write\"].includes(toolName) && typeof pathValue === \"string\" && pathValue.trim()) {\n\t\treturn `${tenantKey}\\0${toolName}:${pathValue.trim()}`;\n\t}\n\tif (toolName === \"background_script\") {\n\t\tconst selector = backgroundScriptSelector(record);\n\t\treturn selector ? `${tenantKey}\\0${toolName}:${selector}` : undefined;\n\t}\n\tif (toolName.endsWith(\"_status\")) return `${tenantKey}\\0${toolName}`;\n\tif (toolName === \"learning_auto_learn_state\") return `${tenantKey}\\0${toolName}:${String(record.action || \"read\")}`;\n\tif (toolName === \"task_steps\") return `${tenantKey}\\0${toolName}:${String(record.action || \"list\")}`;\n\treturn undefined;\n}\n\nexport function shouldReuseToolPanelInPlace(toolName: string, args: unknown): boolean {\n\treturn (\n\t\ttoolName === \"background_script\" &&\n\t\t!!args &&\n\t\ttypeof args === \"object\" &&\n\t\t!!backgroundScriptSelector(args as Record<string, unknown>)\n\t);\n}\n\nexport class ToolPanelRegistry {\n\tprivate readonly panelsByAction = new Map<string, ToolExecutionComponent>();\n\tprivate readonly activeByCallId = new Map<string, ToolExecutionComponent>();\n\tprivate readonly actionKeyByCallId = new Map<string, string>();\n\n\tgetReusable(actionKey: string | undefined, options?: { allowActive?: boolean }): ToolExecutionComponent | undefined {\n\t\tif (!actionKey) return undefined;\n\t\tconst panel = this.panelsByAction.get(actionKey);\n\t\tif (!panel || (!options?.allowActive && this.isActive(panel))) return undefined;\n\t\treturn panel;\n\t}\n\n\treplaceActiveForAction(toolCallId: string, panel: ToolExecutionComponent, actionKey: string): void {\n\t\tfor (const [activeCallId, activeActionKey] of this.actionKeyByCallId.entries()) {\n\t\t\tif (activeActionKey !== actionKey) continue;\n\t\t\tthis.activeByCallId.delete(activeCallId);\n\t\t\tthis.actionKeyByCallId.delete(activeCallId);\n\t\t}\n\t\tthis.register(toolCallId, panel, actionKey);\n\t}\n\n\tregister(toolCallId: string, panel: ToolExecutionComponent, actionKey?: string): void {\n\t\tthis.activeByCallId.set(toolCallId, panel);\n\t\tif (actionKey) {\n\t\t\tthis.panelsByAction.set(actionKey, panel);\n\t\t\tthis.actionKeyByCallId.set(toolCallId, actionKey);\n\t\t}\n\t}\n\n\thasActive(toolCallId: string): boolean {\n\t\treturn this.activeByCallId.has(toolCallId);\n\t}\n\n\tgetActive(toolCallId: string): ToolExecutionComponent | undefined {\n\t\treturn this.activeByCallId.get(toolCallId);\n\t}\n\n\tactiveEntries(): IterableIterator<[string, ToolExecutionComponent]> {\n\t\treturn this.activeByCallId.entries();\n\t}\n\n\tisActive(panel: ToolExecutionComponent): boolean {\n\t\tfor (const active of this.activeByCallId.values()) {\n\t\t\tif (active === panel) return true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tfinish(toolCallId: string): void {\n\t\tthis.activeByCallId.delete(toolCallId);\n\t\tthis.actionKeyByCallId.delete(toolCallId);\n\t}\n\n\tclearActive(): void {\n\t\tthis.activeByCallId.clear();\n\t\tthis.actionKeyByCallId.clear();\n\t}\n\n\tclearAll(): void {\n\t\tthis.activeByCallId.clear();\n\t\tthis.panelsByAction.clear();\n\t\tthis.actionKeyByCallId.clear();\n\t}\n}\n"]}
1
+ {"version":3,"file":"tool-panel-registry.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-panel-registry.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ToolExecutionComponent } from \"./tool-execution.ts\";\n\nexport interface ToolPanelTenantScope {\n\tsessionId?: string;\n\tsessionFile?: string;\n\tcwd: string;\n}\n\nexport function createToolPanelTenantKey(scope: ToolPanelTenantScope): string {\n\treturn [scope.sessionId || \"no-session-id\", scope.sessionFile || \"no-session-file\", scope.cwd].join(\"\\0\");\n}\n\nfunction backgroundScriptActionKey(tenantKey: string, selector: string): string {\n\treturn `${tenantKey}\\0background_script:${selector}`;\n}\n\nfunction backgroundScriptSelector(record: Record<string, unknown>): string | undefined {\n\tconst action = String(record.action || \"list\");\n\tif (action === \"start\" && typeof record.name === \"string\" && record.name.trim()) return record.name.trim();\n\tif ([\"status\", \"logs\", \"stop\"].includes(action) && typeof record.id === \"string\" && record.id.trim()) {\n\t\treturn record.id.trim();\n\t}\n\treturn undefined;\n}\n\nfunction backgroundScriptResultSelectors(result: unknown): string[] {\n\tif (!result || typeof result !== \"object\") return [];\n\tconst details = (result as Record<string, unknown>).details;\n\tif (!details || typeof details !== \"object\") return [];\n\tconst job = (details as Record<string, unknown>).job;\n\tif (!job || typeof job !== \"object\") return [];\n\tconst record = job as Record<string, unknown>;\n\tconst selectors = [record.id, record.name]\n\t\t.filter((value): value is string => typeof value === \"string\" && value.trim().length > 0)\n\t\t.map((value) => value.trim());\n\treturn [...new Set(selectors)];\n}\n\nexport function getToolPanelActionKey(\n\tscope: ToolPanelTenantScope,\n\ttoolName: string,\n\targs: unknown,\n): string | undefined {\n\tconst tenantKey = createToolPanelTenantKey(scope);\n\tif (!args || typeof args !== \"object\") return toolName.endsWith(\"_status\") ? `${tenantKey}\\0${toolName}` : undefined;\n\tconst record = args as Record<string, unknown>;\n\tconst pathValue = record.path ?? record.file_path;\n\tif ([\"read\", \"edit\", \"write\"].includes(toolName) && typeof pathValue === \"string\" && pathValue.trim()) {\n\t\treturn `${tenantKey}\\0${toolName}:${pathValue.trim()}`;\n\t}\n\tif (toolName === \"background_script\") {\n\t\tconst selector = backgroundScriptSelector(record);\n\t\treturn selector ? backgroundScriptActionKey(tenantKey, selector) : undefined;\n\t}\n\tif (toolName.endsWith(\"_status\")) return `${tenantKey}\\0${toolName}`;\n\tif (toolName === \"learning_auto_learn_state\") return `${tenantKey}\\0${toolName}:${String(record.action || \"read\")}`;\n\tif (toolName === \"task_steps\") return `${tenantKey}\\0${toolName}:${String(record.action || \"list\")}`;\n\treturn undefined;\n}\n\nexport function getToolPanelResultActionKeys(scope: ToolPanelTenantScope, toolName: string, result: unknown): string[] {\n\tif (toolName !== \"background_script\") return [];\n\tconst tenantKey = createToolPanelTenantKey(scope);\n\treturn backgroundScriptResultSelectors(result).map((selector) => backgroundScriptActionKey(tenantKey, selector));\n}\n\nexport function shouldReuseToolPanelInPlace(toolName: string, args: unknown): boolean {\n\treturn (\n\t\ttoolName === \"background_script\" &&\n\t\t!!args &&\n\t\ttypeof args === \"object\" &&\n\t\t!!backgroundScriptSelector(args as Record<string, unknown>)\n\t);\n}\n\nexport class ToolPanelRegistry {\n\tprivate readonly panelsByAction = new Map<string, ToolExecutionComponent>();\n\tprivate readonly activeByCallId = new Map<string, ToolExecutionComponent>();\n\tprivate readonly actionKeyByCallId = new Map<string, string>();\n\n\tgetReusable(actionKey: string | undefined, options?: { allowActive?: boolean }): ToolExecutionComponent | undefined {\n\t\tif (!actionKey) return undefined;\n\t\tconst panel = this.panelsByAction.get(actionKey);\n\t\tif (!panel || (!options?.allowActive && this.isActive(panel))) return undefined;\n\t\treturn panel;\n\t}\n\n\treplaceActiveForAction(toolCallId: string, panel: ToolExecutionComponent, actionKey: string): void {\n\t\tfor (const [activeCallId, activeActionKey] of this.actionKeyByCallId.entries()) {\n\t\t\tif (activeActionKey !== actionKey) continue;\n\t\t\tthis.activeByCallId.delete(activeCallId);\n\t\t\tthis.actionKeyByCallId.delete(activeCallId);\n\t\t}\n\t\tthis.register(toolCallId, panel, actionKey);\n\t}\n\n\tregister(toolCallId: string, panel: ToolExecutionComponent, actionKey?: string): void {\n\t\tthis.activeByCallId.set(toolCallId, panel);\n\t\tif (actionKey) {\n\t\t\tthis.panelsByAction.set(actionKey, panel);\n\t\t\tthis.actionKeyByCallId.set(toolCallId, actionKey);\n\t\t}\n\t}\n\n\tregisterAliases(panel: ToolExecutionComponent, actionKeys: string[]): void {\n\t\tfor (const actionKey of actionKeys) {\n\t\t\tthis.panelsByAction.set(actionKey, panel);\n\t\t}\n\t}\n\n\thasActive(toolCallId: string): boolean {\n\t\treturn this.activeByCallId.has(toolCallId);\n\t}\n\n\tgetActive(toolCallId: string): ToolExecutionComponent | undefined {\n\t\treturn this.activeByCallId.get(toolCallId);\n\t}\n\n\tactiveEntries(): IterableIterator<[string, ToolExecutionComponent]> {\n\t\treturn this.activeByCallId.entries();\n\t}\n\n\tisActive(panel: ToolExecutionComponent): boolean {\n\t\tfor (const active of this.activeByCallId.values()) {\n\t\t\tif (active === panel) return true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tfinish(toolCallId: string): void {\n\t\tthis.activeByCallId.delete(toolCallId);\n\t\tthis.actionKeyByCallId.delete(toolCallId);\n\t}\n\n\tclearActive(): void {\n\t\tthis.activeByCallId.clear();\n\t\tthis.actionKeyByCallId.clear();\n\t}\n\n\tclearAll(): void {\n\t\tthis.activeByCallId.clear();\n\t\tthis.panelsByAction.clear();\n\t\tthis.actionKeyByCallId.clear();\n\t}\n}\n"]}