hammoc 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/package.json +2 -2
- package/packages/client/dist/assets/{agentExampleHighlight-ltj9ce0U.js → agentExampleHighlight-7Olvqdpf.js} +1 -1
- package/packages/client/dist/assets/{commandTokenHighlight-ji_ViMb4.js → commandTokenHighlight-DtKwh4lx.js} +1 -1
- package/packages/client/dist/assets/{index-BT4RIi0U.js → index-Bee52CKG.js} +556 -510
- package/packages/client/dist/assets/index-CVy582lU.css +32 -0
- package/packages/client/dist/assets/{index-B-DiRGuz.js → index-DLHBUw8c.js} +1 -1
- package/packages/client/dist/assets/{snippetTokenHighlight-CP3v4o2g.js → snippetTokenHighlight-C8O688f4.js} +1 -1
- package/packages/client/dist/index.html +2 -2
- package/packages/client/dist/sw.js +2 -2
- package/packages/server/dist/_dbg_agent_rows.d.ts +2 -0
- package/packages/server/dist/_dbg_agent_rows.d.ts.map +1 -0
- package/packages/server/dist/_dbg_agent_rows.js +60 -0
- package/packages/server/dist/_dbg_agent_rows.js.map +1 -0
- package/packages/server/dist/_dbg_flicker.d.ts +2 -0
- package/packages/server/dist/_dbg_flicker.d.ts.map +1 -0
- package/packages/server/dist/_dbg_flicker.js +38 -0
- package/packages/server/dist/_dbg_flicker.js.map +1 -0
- package/packages/server/dist/_harness_cli.d.ts +2 -0
- package/packages/server/dist/_harness_cli.d.ts.map +1 -0
- package/packages/server/dist/_harness_cli.js +81 -0
- package/packages/server/dist/_harness_cli.js.map +1 -0
- package/packages/server/dist/_harness_provcard.d.ts +2 -0
- package/packages/server/dist/_harness_provcard.d.ts.map +1 -0
- package/packages/server/dist/_harness_provcard.js +67 -0
- package/packages/server/dist/_harness_provcard.js.map +1 -0
- package/packages/server/dist/_replay_dump.d.ts +2 -0
- package/packages/server/dist/_replay_dump.d.ts.map +1 -0
- package/packages/server/dist/_replay_dump.js +62 -0
- package/packages/server/dist/_replay_dump.js.map +1 -0
- package/packages/server/dist/app.d.ts.map +1 -1
- package/packages/server/dist/app.js +6 -0
- package/packages/server/dist/app.js.map +1 -1
- package/packages/server/dist/config/index.d.ts.map +1 -1
- package/packages/server/dist/config/index.js.map +1 -1
- package/packages/server/dist/controllers/projectController.d.ts.map +1 -1
- package/packages/server/dist/controllers/projectController.js +7 -1
- package/packages/server/dist/controllers/projectController.js.map +1 -1
- package/packages/server/dist/controllers/sessionController.d.ts.map +1 -1
- package/packages/server/dist/controllers/sessionController.js +16 -4
- package/packages/server/dist/controllers/sessionController.js.map +1 -1
- package/packages/server/dist/controllers/systemBrowseController.d.ts +33 -0
- package/packages/server/dist/controllers/systemBrowseController.d.ts.map +1 -0
- package/packages/server/dist/controllers/systemBrowseController.js +105 -0
- package/packages/server/dist/controllers/systemBrowseController.js.map +1 -0
- package/packages/server/dist/handlers/streamCallbacks.d.ts +2 -0
- package/packages/server/dist/handlers/streamCallbacks.d.ts.map +1 -1
- package/packages/server/dist/handlers/streamCallbacks.js +17 -4
- package/packages/server/dist/handlers/streamCallbacks.js.map +1 -1
- package/packages/server/dist/handlers/websocket.d.ts +43 -3
- package/packages/server/dist/handlers/websocket.d.ts.map +1 -1
- package/packages/server/dist/handlers/websocket.js +362 -92
- package/packages/server/dist/handlers/websocket.js.map +1 -1
- package/packages/server/dist/index.js +2 -0
- package/packages/server/dist/index.js.map +1 -1
- package/packages/server/dist/locales/en/server.json +17 -0
- package/packages/server/dist/locales/es/server.json +17 -0
- package/packages/server/dist/locales/ja/server.json +17 -0
- package/packages/server/dist/locales/ko/server.json +17 -0
- package/packages/server/dist/locales/pt/server.json +17 -0
- package/packages/server/dist/locales/zh-CN/server.json +17 -0
- package/packages/server/dist/routes/preferences.d.ts.map +1 -1
- package/packages/server/dist/routes/preferences.js +12 -2
- package/packages/server/dist/routes/preferences.js.map +1 -1
- package/packages/server/dist/routes/systemBrowse.d.ts +17 -0
- package/packages/server/dist/routes/systemBrowse.d.ts.map +1 -0
- package/packages/server/dist/routes/systemBrowse.js +22 -0
- package/packages/server/dist/routes/systemBrowse.js.map +1 -0
- package/packages/server/dist/services/bmadStatusService.d.ts.map +1 -1
- package/packages/server/dist/services/bmadStatusService.js +18 -7
- package/packages/server/dist/services/bmadStatusService.js.map +1 -1
- package/packages/server/dist/services/chatEngine.d.ts +81 -0
- package/packages/server/dist/services/chatEngine.d.ts.map +1 -0
- package/packages/server/dist/services/chatEngine.js +2 -0
- package/packages/server/dist/services/chatEngine.js.map +1 -0
- package/packages/server/dist/services/chatEngineFactory.d.ts +15 -0
- package/packages/server/dist/services/chatEngineFactory.d.ts.map +1 -0
- package/packages/server/dist/services/chatEngineFactory.js +28 -0
- package/packages/server/dist/services/chatEngineFactory.js.map +1 -0
- package/packages/server/dist/services/chatService.d.ts +34 -26
- package/packages/server/dist/services/chatService.d.ts.map +1 -1
- package/packages/server/dist/services/chatService.js +43 -103
- package/packages/server/dist/services/chatService.js.map +1 -1
- package/packages/server/dist/services/cliChatEngine.d.ts +198 -0
- package/packages/server/dist/services/cliChatEngine.d.ts.map +1 -0
- package/packages/server/dist/services/cliChatEngine.js +2977 -0
- package/packages/server/dist/services/cliChatEngine.js.map +1 -0
- package/packages/server/dist/services/cliGridCards.d.ts +87 -0
- package/packages/server/dist/services/cliGridCards.d.ts.map +1 -0
- package/packages/server/dist/services/cliGridCards.js +298 -0
- package/packages/server/dist/services/cliGridCards.js.map +1 -0
- package/packages/server/dist/services/cliGridRegion.d.ts +44 -0
- package/packages/server/dist/services/cliGridRegion.d.ts.map +1 -0
- package/packages/server/dist/services/cliGridRegion.js +94 -0
- package/packages/server/dist/services/cliGridRegion.js.map +1 -0
- package/packages/server/dist/services/cliModalDetect.d.ts +299 -0
- package/packages/server/dist/services/cliModalDetect.d.ts.map +1 -0
- package/packages/server/dist/services/cliModalDetect.js +583 -0
- package/packages/server/dist/services/cliModalDetect.js.map +1 -0
- package/packages/server/dist/services/cliScreenCache.d.ts +33 -0
- package/packages/server/dist/services/cliScreenCache.d.ts.map +1 -0
- package/packages/server/dist/services/cliScreenCache.js +48 -0
- package/packages/server/dist/services/cliScreenCache.js.map +1 -0
- package/packages/server/dist/services/cliScreenModel.d.ts +141 -0
- package/packages/server/dist/services/cliScreenModel.d.ts.map +1 -0
- package/packages/server/dist/services/cliScreenModel.js +196 -0
- package/packages/server/dist/services/cliScreenModel.js.map +1 -0
- package/packages/server/dist/services/cliScreenStallWatchdog.d.ts +41 -0
- package/packages/server/dist/services/cliScreenStallWatchdog.d.ts.map +1 -0
- package/packages/server/dist/services/cliScreenStallWatchdog.js +45 -0
- package/packages/server/dist/services/cliScreenStallWatchdog.js.map +1 -0
- package/packages/server/dist/services/cliSessionPool.d.ts +97 -0
- package/packages/server/dist/services/cliSessionPool.d.ts.map +1 -0
- package/packages/server/dist/services/cliSessionPool.js +278 -0
- package/packages/server/dist/services/cliSessionPool.js.map +1 -0
- package/packages/server/dist/services/cliSpinnerProgress.d.ts +41 -0
- package/packages/server/dist/services/cliSpinnerProgress.d.ts.map +1 -0
- package/packages/server/dist/services/cliSpinnerProgress.js +131 -0
- package/packages/server/dist/services/cliSpinnerProgress.js.map +1 -0
- package/packages/server/dist/services/fileRewind.d.ts +46 -0
- package/packages/server/dist/services/fileRewind.d.ts.map +1 -0
- package/packages/server/dist/services/fileRewind.js +77 -0
- package/packages/server/dist/services/fileRewind.js.map +1 -0
- package/packages/server/dist/services/historyParser.d.ts +11 -0
- package/packages/server/dist/services/historyParser.d.ts.map +1 -1
- package/packages/server/dist/services/historyParser.js +10 -8
- package/packages/server/dist/services/historyParser.js.map +1 -1
- package/packages/server/dist/services/imageStorageService.d.ts +12 -0
- package/packages/server/dist/services/imageStorageService.d.ts.map +1 -1
- package/packages/server/dist/services/imageStorageService.js +22 -0
- package/packages/server/dist/services/imageStorageService.js.map +1 -1
- package/packages/server/dist/services/projectService.d.ts +13 -1
- package/packages/server/dist/services/projectService.d.ts.map +1 -1
- package/packages/server/dist/services/projectService.js +32 -0
- package/packages/server/dist/services/projectService.js.map +1 -1
- package/packages/server/dist/services/queueService.d.ts.map +1 -1
- package/packages/server/dist/services/queueService.js +9 -3
- package/packages/server/dist/services/queueService.js.map +1 -1
- package/packages/server/dist/services/rateLimitProbeService.d.ts +15 -0
- package/packages/server/dist/services/rateLimitProbeService.d.ts.map +1 -1
- package/packages/server/dist/services/rateLimitProbeService.js +48 -19
- package/packages/server/dist/services/rateLimitProbeService.js.map +1 -1
- package/packages/server/dist/services/streamHandler.d.ts +8 -1
- package/packages/server/dist/services/streamHandler.d.ts.map +1 -1
- package/packages/server/dist/services/streamHandler.js +12 -5
- package/packages/server/dist/services/streamHandler.js.map +1 -1
- package/packages/server/dist/services/systemBrowseService.d.ts +91 -0
- package/packages/server/dist/services/systemBrowseService.d.ts.map +1 -0
- package/packages/server/dist/services/systemBrowseService.js +372 -0
- package/packages/server/dist/services/systemBrowseService.js.map +1 -0
- package/packages/server/dist/services/workspaceContext.d.ts +24 -0
- package/packages/server/dist/services/workspaceContext.d.ts.map +1 -0
- package/packages/server/dist/services/workspaceContext.js +109 -0
- package/packages/server/dist/services/workspaceContext.js.map +1 -0
- package/packages/server/dist/snippets/qa-review +2 -0
- package/packages/server/dist/utils/backgroundBlock.d.ts +29 -0
- package/packages/server/dist/utils/backgroundBlock.d.ts.map +1 -0
- package/packages/server/dist/utils/backgroundBlock.js +33 -0
- package/packages/server/dist/utils/backgroundBlock.js.map +1 -0
- package/packages/server/dist/utils/backgroundTaskTracker.d.ts +20 -0
- package/packages/server/dist/utils/backgroundTaskTracker.d.ts.map +1 -0
- package/packages/server/dist/utils/backgroundTaskTracker.js +40 -0
- package/packages/server/dist/utils/backgroundTaskTracker.js.map +1 -0
- package/packages/server/dist/utils/bundledBinaryModelSupport.d.ts +7 -0
- package/packages/server/dist/utils/bundledBinaryModelSupport.d.ts.map +1 -1
- package/packages/server/dist/utils/bundledBinaryModelSupport.js +9 -4
- package/packages/server/dist/utils/bundledBinaryModelSupport.js.map +1 -1
- package/packages/server/dist/utils/cliDebugLog.d.ts +38 -0
- package/packages/server/dist/utils/cliDebugLog.d.ts.map +1 -0
- package/packages/server/dist/utils/cliDebugLog.js +65 -0
- package/packages/server/dist/utils/cliDebugLog.js.map +1 -0
- package/packages/server/dist/utils/cliEngineUtils.d.ts +35 -0
- package/packages/server/dist/utils/cliEngineUtils.d.ts.map +1 -0
- package/packages/server/dist/utils/cliEngineUtils.js +38 -0
- package/packages/server/dist/utils/cliEngineUtils.js.map +1 -0
- package/packages/server/dist/utils/effortUtils.d.ts.map +1 -1
- package/packages/server/dist/utils/effortUtils.js +5 -3
- package/packages/server/dist/utils/effortUtils.js.map +1 -1
- package/packages/server/dist/utils/trailingThrottle.d.ts +21 -0
- package/packages/server/dist/utils/trailingThrottle.d.ts.map +1 -0
- package/packages/server/dist/utils/trailingThrottle.js +36 -0
- package/packages/server/dist/utils/trailingThrottle.js.map +1 -0
- package/packages/server/package.json +61 -59
- package/packages/server/resources/internals/image-storage.md +9 -0
- package/packages/server/resources/manual/02-chat.md +22 -3
- package/packages/server/resources/manual/03-sessions.md +1 -0
- package/packages/server/resources/manual/05-projects.md +12 -1
- package/packages/server/resources/manual/11-bmad-method-integration.md +2 -0
- package/packages/server/resources/manual/13-settings.md +57 -5
- package/packages/shared/dist/index.d.ts +3 -0
- package/packages/shared/dist/index.d.ts.map +1 -1
- package/packages/shared/dist/index.js +6 -0
- package/packages/shared/dist/index.js.map +1 -1
- package/packages/shared/dist/types/bmadStatus.d.ts +16 -0
- package/packages/shared/dist/types/bmadStatus.d.ts.map +1 -1
- package/packages/shared/dist/types/bmadStatus.js.map +1 -1
- package/packages/shared/dist/types/preferences.d.ts +14 -2
- package/packages/shared/dist/types/preferences.d.ts.map +1 -1
- package/packages/shared/dist/types/preferences.js +1 -0
- package/packages/shared/dist/types/preferences.js.map +1 -1
- package/packages/shared/dist/types/project.d.ts +7 -1
- package/packages/shared/dist/types/project.d.ts.map +1 -1
- package/packages/shared/dist/types/project.js.map +1 -1
- package/packages/shared/dist/types/sdk.d.ts +123 -11
- package/packages/shared/dist/types/sdk.d.ts.map +1 -1
- package/packages/shared/dist/types/sdk.js +64 -19
- package/packages/shared/dist/types/sdk.js.map +1 -1
- package/packages/shared/dist/types/streaming.d.ts +2 -2
- package/packages/shared/dist/types/streaming.d.ts.map +1 -1
- package/packages/shared/dist/types/streaming.js.map +1 -1
- package/packages/shared/dist/types/systemBrowse.d.ts +120 -0
- package/packages/shared/dist/types/systemBrowse.d.ts.map +1 -0
- package/packages/shared/dist/types/systemBrowse.js +57 -0
- package/packages/shared/dist/types/systemBrowse.js.map +1 -0
- package/packages/shared/dist/types/websocket.d.ts +38 -0
- package/packages/shared/dist/types/websocket.d.ts.map +1 -1
- package/packages/shared/dist/utils/interruptFiller.d.ts +30 -0
- package/packages/shared/dist/utils/interruptFiller.d.ts.map +1 -0
- package/packages/shared/dist/utils/interruptFiller.js +38 -0
- package/packages/shared/dist/utils/interruptFiller.js.map +1 -0
- package/packages/shared/dist/utils/toolResultContent.d.ts +22 -0
- package/packages/shared/dist/utils/toolResultContent.d.ts.map +1 -0
- package/packages/shared/dist/utils/toolResultContent.js +29 -0
- package/packages/shared/dist/utils/toolResultContent.js.map +1 -0
- package/scripts/run-integration-test.mjs +362 -362
- package/packages/client/dist/assets/index-DyNJ5jEW.css +0 -32
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background-execution block policy shared by both chat engines (Story 36.1).
|
|
3
|
+
*
|
|
4
|
+
* Hammoc runs one CLI/SDK process per turn (turn-per-process) and kills it when
|
|
5
|
+
* the turn ends, so a backgrounded tool call (`run_in_background: true`) would be
|
|
6
|
+
* orphaned/killed and only leaves side effects (e.g. task-notification files).
|
|
7
|
+
* A PreToolUse hook denies such calls before they reach the shell — and unlike
|
|
8
|
+
* canUseTool, a PreToolUse deny also covers auto-approved tools (bypass/auto modes).
|
|
9
|
+
*
|
|
10
|
+
* SDK mode wires the check as an inline hook callback (see chatService); CLI mode
|
|
11
|
+
* runs it as an external command hook (resources/hooks/block-background.cjs). The
|
|
12
|
+
* two runtimes differ, so only the predicate + reason are shared here.
|
|
13
|
+
*
|
|
14
|
+
* ⚠️ The .cjs script duplicates BACKGROUND_BLOCK_REASON as a literal (it cannot
|
|
15
|
+
* import a TS module); keep the two strings in sync.
|
|
16
|
+
*/
|
|
17
|
+
export declare const BACKGROUND_BLOCK_REASON = "Background execution is disabled in Hammoc: it runs one process per turn, so a backgrounded task is killed when the turn ends. Re-run without run_in_background (foreground).";
|
|
18
|
+
/**
|
|
19
|
+
* True when a tool call requests background execution (`run_in_background: true`) — which
|
|
20
|
+
* must be blocked regardless of WHICH tool it is. Hammoc is turn-per-process, so ANY
|
|
21
|
+
* backgrounded call is orphaned at turn end. We key off the INPUT FLAG, not the tool name:
|
|
22
|
+
* a tool-name allow-list silently misses tools (that was the earlier Windows PowerShell gap),
|
|
23
|
+
* whereas the flag is the actual thing that makes the call doomed.
|
|
24
|
+
*
|
|
25
|
+
* Crucially this does NOT touch foreground execution: several foreground tools launched in
|
|
26
|
+
* parallel within one turn and awaited carry no `run_in_background` flag, so they pass through.
|
|
27
|
+
*/
|
|
28
|
+
export declare function isBlockedBackgroundCall(toolInput: unknown): boolean;
|
|
29
|
+
//# sourceMappingURL=backgroundBlock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backgroundBlock.d.ts","sourceRoot":"","sources":["../../src/utils/backgroundBlock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,uBAAuB,kLAC6I,CAAC;AAElL;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAMnE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background-execution block policy shared by both chat engines (Story 36.1).
|
|
3
|
+
*
|
|
4
|
+
* Hammoc runs one CLI/SDK process per turn (turn-per-process) and kills it when
|
|
5
|
+
* the turn ends, so a backgrounded tool call (`run_in_background: true`) would be
|
|
6
|
+
* orphaned/killed and only leaves side effects (e.g. task-notification files).
|
|
7
|
+
* A PreToolUse hook denies such calls before they reach the shell — and unlike
|
|
8
|
+
* canUseTool, a PreToolUse deny also covers auto-approved tools (bypass/auto modes).
|
|
9
|
+
*
|
|
10
|
+
* SDK mode wires the check as an inline hook callback (see chatService); CLI mode
|
|
11
|
+
* runs it as an external command hook (resources/hooks/block-background.cjs). The
|
|
12
|
+
* two runtimes differ, so only the predicate + reason are shared here.
|
|
13
|
+
*
|
|
14
|
+
* ⚠️ The .cjs script duplicates BACKGROUND_BLOCK_REASON as a literal (it cannot
|
|
15
|
+
* import a TS module); keep the two strings in sync.
|
|
16
|
+
*/
|
|
17
|
+
export const BACKGROUND_BLOCK_REASON = 'Background execution is disabled in Hammoc: it runs one process per turn, so a backgrounded task is killed when the turn ends. Re-run without run_in_background (foreground).';
|
|
18
|
+
/**
|
|
19
|
+
* True when a tool call requests background execution (`run_in_background: true`) — which
|
|
20
|
+
* must be blocked regardless of WHICH tool it is. Hammoc is turn-per-process, so ANY
|
|
21
|
+
* backgrounded call is orphaned at turn end. We key off the INPUT FLAG, not the tool name:
|
|
22
|
+
* a tool-name allow-list silently misses tools (that was the earlier Windows PowerShell gap),
|
|
23
|
+
* whereas the flag is the actual thing that makes the call doomed.
|
|
24
|
+
*
|
|
25
|
+
* Crucially this does NOT touch foreground execution: several foreground tools launched in
|
|
26
|
+
* parallel within one turn and awaited carry no `run_in_background` flag, so they pass through.
|
|
27
|
+
*/
|
|
28
|
+
export function isBlockedBackgroundCall(toolInput) {
|
|
29
|
+
return (typeof toolInput === 'object' &&
|
|
30
|
+
toolInput !== null &&
|
|
31
|
+
toolInput.run_in_background === true);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=backgroundBlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backgroundBlock.js","sourceRoot":"","sources":["../../src/utils/backgroundBlock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAClC,+KAA+K,CAAC;AAElL;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAkB;IACxD,OAAO,CACL,OAAO,SAAS,KAAK,QAAQ;QAC7B,SAAS,KAAK,IAAI;QACjB,SAA6C,CAAC,iBAAiB,KAAK,IAAI,CAC1E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface BackgroundTaskState {
|
|
2
|
+
pending: number;
|
|
3
|
+
waiting: boolean;
|
|
4
|
+
}
|
|
5
|
+
export type BackgroundTaskChangeCallback = (state: BackgroundTaskState) => void;
|
|
6
|
+
export declare class BackgroundTaskTracker {
|
|
7
|
+
private pendingCount;
|
|
8
|
+
private _mainResponseEnded;
|
|
9
|
+
private onChange?;
|
|
10
|
+
constructor(onChange?: BackgroundTaskChangeCallback);
|
|
11
|
+
trackToolUse(input: unknown): void;
|
|
12
|
+
trackTaskDone(): void;
|
|
13
|
+
markMainEnded(): void;
|
|
14
|
+
get mainResponseEnded(): boolean;
|
|
15
|
+
get isWaiting(): boolean;
|
|
16
|
+
get isFullyDone(): boolean;
|
|
17
|
+
get pending(): number;
|
|
18
|
+
private notify;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=backgroundTaskTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backgroundTaskTracker.d.ts","sourceRoot":"","sources":["../../src/utils/backgroundTaskTracker.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,4BAA4B,GAAG,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;AAEhF,qBAAa,qBAAqB;IAChC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,CAA+B;gBAEpC,QAAQ,CAAC,EAAE,4BAA4B;IAInD,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAWlC,aAAa,IAAI,IAAI;IAKrB,aAAa,IAAI,IAAI;IAKrB,IAAI,iBAAiB,IAAI,OAAO,CAE/B;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,OAAO,CAAC,MAAM;CAGf"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export class BackgroundTaskTracker {
|
|
2
|
+
pendingCount = 0;
|
|
3
|
+
_mainResponseEnded = false;
|
|
4
|
+
onChange;
|
|
5
|
+
constructor(onChange) {
|
|
6
|
+
this.onChange = onChange;
|
|
7
|
+
}
|
|
8
|
+
trackToolUse(input) {
|
|
9
|
+
if (typeof input === 'object' &&
|
|
10
|
+
input !== null &&
|
|
11
|
+
input.run_in_background === true) {
|
|
12
|
+
this.pendingCount++;
|
|
13
|
+
this.notify();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
trackTaskDone() {
|
|
17
|
+
this.pendingCount = Math.max(0, this.pendingCount - 1);
|
|
18
|
+
this.notify();
|
|
19
|
+
}
|
|
20
|
+
markMainEnded() {
|
|
21
|
+
this._mainResponseEnded = true;
|
|
22
|
+
this.notify();
|
|
23
|
+
}
|
|
24
|
+
get mainResponseEnded() {
|
|
25
|
+
return this._mainResponseEnded;
|
|
26
|
+
}
|
|
27
|
+
get isWaiting() {
|
|
28
|
+
return this._mainResponseEnded && this.pendingCount > 0;
|
|
29
|
+
}
|
|
30
|
+
get isFullyDone() {
|
|
31
|
+
return this._mainResponseEnded && this.pendingCount === 0;
|
|
32
|
+
}
|
|
33
|
+
get pending() {
|
|
34
|
+
return this.pendingCount;
|
|
35
|
+
}
|
|
36
|
+
notify() {
|
|
37
|
+
this.onChange?.({ pending: this.pendingCount, waiting: this.isWaiting });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=backgroundTaskTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backgroundTaskTracker.js","sourceRoot":"","sources":["../../src/utils/backgroundTaskTracker.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,qBAAqB;IACxB,YAAY,GAAG,CAAC,CAAC;IACjB,kBAAkB,GAAG,KAAK,CAAC;IAC3B,QAAQ,CAAgC;IAEhD,YAAY,QAAuC;QACjD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,YAAY,CAAC,KAAc;QACzB,IACE,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,KAAK,IAAI;YACb,KAAyC,CAAC,iBAAiB,KAAK,IAAI,EACrE,CAAC;YACD,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,aAAa;QACX,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,aAAa;QACX,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEO,MAAM;QACZ,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3E,CAAC;CACF"}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the platform binary path (claude.exe on Windows, claude elsewhere) bundled inside
|
|
3
|
+
* @anthropic-ai/claude-agent-sdk, or null if not installed. Exported so CLI mode
|
|
4
|
+
* (cliSessionPool) can prefer this version-pinned engine over a system install — it is the
|
|
5
|
+
* same Claude Code CLI binary, so SDK and CLI modes run the identical engine.
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveBundledBinaryPath(): string | null;
|
|
1
8
|
/**
|
|
2
9
|
* True when `model` is a known native-1M model but the bundled binary does NOT
|
|
3
10
|
* recognize it — so its 1M context silently falls back to ~200K. Conservative:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundledBinaryModelSupport.d.ts","sourceRoot":"","sources":["../../src/utils/bundledBinaryModelSupport.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bundledBinaryModelSupport.d.ts","sourceRoot":"","sources":["../../src/utils/bundledBinaryModelSupport.ts"],"names":[],"mappings":"AA2BA;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,GAAG,IAAI,CAUxD;AAwCD;;;;GAIG;AACH,wBAAsB,2BAA2B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBlF"}
|
|
@@ -18,11 +18,16 @@ import { isNative1MModel } from '@hammoc/shared';
|
|
|
18
18
|
import { createLogger } from './logger.js';
|
|
19
19
|
const log = createLogger('bundledBinaryModelSupport');
|
|
20
20
|
/** Claude model ids embedded in the binary, e.g. claude-opus-4-8, claude-sonnet-4-6, claude-opus-4-20250514. */
|
|
21
|
-
const MODEL_ID_RE = /claude-(?:opus|sonnet|haiku)-[0-9]+(?:-[0-9]+)*/g;
|
|
21
|
+
const MODEL_ID_RE = /claude-(?:opus|sonnet|haiku|fable|mythos)-[0-9]+(?:-[0-9]+)*/g;
|
|
22
22
|
let cache = null;
|
|
23
23
|
let scanPromise = null;
|
|
24
|
-
/**
|
|
25
|
-
|
|
24
|
+
/**
|
|
25
|
+
* Resolve the platform binary path (claude.exe on Windows, claude elsewhere) bundled inside
|
|
26
|
+
* @anthropic-ai/claude-agent-sdk, or null if not installed. Exported so CLI mode
|
|
27
|
+
* (cliSessionPool) can prefer this version-pinned engine over a system install — it is the
|
|
28
|
+
* same Claude Code CLI binary, so SDK and CLI modes run the identical engine.
|
|
29
|
+
*/
|
|
30
|
+
export function resolveBundledBinaryPath() {
|
|
26
31
|
const pkg = `@anthropic-ai/claude-agent-sdk-${os.platform()}-${os.arch()}`;
|
|
27
32
|
const exe = os.platform() === 'win32' ? 'claude.exe' : 'claude';
|
|
28
33
|
try {
|
|
@@ -90,7 +95,7 @@ export async function modelMissingNative1MSupport(model) {
|
|
|
90
95
|
const base = model.replace(/\[1m\]$/i, '');
|
|
91
96
|
// Only fully-versioned ids are checkable against the binary; bare aliases like
|
|
92
97
|
// 'opus'/'sonnet' resolve to a concrete model server-side, so skip them.
|
|
93
|
-
if (!/^claude-(?:opus|sonnet|haiku)-[0-9]/.test(base))
|
|
98
|
+
if (!/^claude-(?:opus|sonnet|haiku|fable|mythos)-[0-9]/.test(base))
|
|
94
99
|
return false;
|
|
95
100
|
if (!isNative1MModel(base))
|
|
96
101
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundledBinaryModelSupport.js","sourceRoot":"","sources":["../../src/utils/bundledBinaryModelSupport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,GAAG,GAAG,YAAY,CAAC,2BAA2B,CAAC,CAAC;AAEtD,gHAAgH;AAChH,MAAM,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"bundledBinaryModelSupport.js","sourceRoot":"","sources":["../../src/utils/bundledBinaryModelSupport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Debug Log — unified per-session decision trace for CLI-mode debugging.
|
|
3
|
+
*
|
|
4
|
+
* Records every classification/emit decision the server makes (screen parse → block
|
|
5
|
+
* type → client emit, file parse → block type → client emit) and every decision the
|
|
6
|
+
* client reports back (event received → segment classified → rendered). Both sides
|
|
7
|
+
* land in ONE chronological file so a post-mortem can diff server-emitted vs
|
|
8
|
+
* client-received at each timestamp.
|
|
9
|
+
*
|
|
10
|
+
* Activation: always-on when CLI engine runs (lightweight — one WriteStream per turn,
|
|
11
|
+
* best-effort writes). No env-var gate; the file is gitignored under `logs/`.
|
|
12
|
+
*
|
|
13
|
+
* Format (one JSON line per entry):
|
|
14
|
+
* {"ts":"2026-06-20T10:15:32.123Z","src":"S","ev":"grid-card-emit","d":{...}}
|
|
15
|
+
* {"ts":"2026-06-20T10:15:32.200Z","src":"C","ev":"recv-thinking","d":{...}}
|
|
16
|
+
*
|
|
17
|
+
* `src`: "S" = [CLILog-Server], "C" = [CLILog-Client]
|
|
18
|
+
*/
|
|
19
|
+
export interface CliDebugLogEntry {
|
|
20
|
+
ts: string;
|
|
21
|
+
src: 'S' | 'C';
|
|
22
|
+
ev: string;
|
|
23
|
+
d?: Record<string, unknown>;
|
|
24
|
+
}
|
|
25
|
+
export declare class CliDebugLog {
|
|
26
|
+
private stream;
|
|
27
|
+
readonly filePath: string;
|
|
28
|
+
constructor(sessionId: string);
|
|
29
|
+
/** Server-side decision log. */
|
|
30
|
+
server(event: string, data?: Record<string, unknown>): void;
|
|
31
|
+
/** Client-side decision log (relayed from browser via socket). */
|
|
32
|
+
client(event: string, data?: Record<string, unknown>): void;
|
|
33
|
+
/** Client-side decision log with original client timestamp preserved. */
|
|
34
|
+
clientWithTs(ts: string, event: string, data?: Record<string, unknown>): void;
|
|
35
|
+
close(): void;
|
|
36
|
+
private write;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=cliDebugLog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliDebugLog.d.ts","sourceRoot":"","sources":["../../src/utils/cliDebugLog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7B;AAID,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA4B;IAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,SAAS,EAAE,MAAM;IAY7B,gCAAgC;IAChC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI3D,kEAAkE;IAClE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI3D,yEAAyE;IACzE,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI7E,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,KAAK;CAMd"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Debug Log — unified per-session decision trace for CLI-mode debugging.
|
|
3
|
+
*
|
|
4
|
+
* Records every classification/emit decision the server makes (screen parse → block
|
|
5
|
+
* type → client emit, file parse → block type → client emit) and every decision the
|
|
6
|
+
* client reports back (event received → segment classified → rendered). Both sides
|
|
7
|
+
* land in ONE chronological file so a post-mortem can diff server-emitted vs
|
|
8
|
+
* client-received at each timestamp.
|
|
9
|
+
*
|
|
10
|
+
* Activation: always-on when CLI engine runs (lightweight — one WriteStream per turn,
|
|
11
|
+
* best-effort writes). No env-var gate; the file is gitignored under `logs/`.
|
|
12
|
+
*
|
|
13
|
+
* Format (one JSON line per entry):
|
|
14
|
+
* {"ts":"2026-06-20T10:15:32.123Z","src":"S","ev":"grid-card-emit","d":{...}}
|
|
15
|
+
* {"ts":"2026-06-20T10:15:32.200Z","src":"C","ev":"recv-thinking","d":{...}}
|
|
16
|
+
*
|
|
17
|
+
* `src`: "S" = [CLILog-Server], "C" = [CLILog-Client]
|
|
18
|
+
*/
|
|
19
|
+
import { mkdirSync, createWriteStream } from 'fs';
|
|
20
|
+
import path from 'path';
|
|
21
|
+
const LOG_DIR = path.join(process.cwd(), 'logs', 'cli-debug');
|
|
22
|
+
export class CliDebugLog {
|
|
23
|
+
stream = null;
|
|
24
|
+
filePath;
|
|
25
|
+
constructor(sessionId) {
|
|
26
|
+
const sid = sessionId || 'unknown';
|
|
27
|
+
const fname = `${sid}-${Date.now()}.jsonl`;
|
|
28
|
+
this.filePath = path.join(LOG_DIR, fname);
|
|
29
|
+
try {
|
|
30
|
+
mkdirSync(LOG_DIR, { recursive: true });
|
|
31
|
+
this.stream = createWriteStream(this.filePath, { encoding: 'utf8' });
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// best-effort — never break the engine
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Server-side decision log. */
|
|
38
|
+
server(event, data) {
|
|
39
|
+
this.write({ ts: new Date().toISOString(), src: 'S', ev: event, ...(data ? { d: data } : {}) });
|
|
40
|
+
}
|
|
41
|
+
/** Client-side decision log (relayed from browser via socket). */
|
|
42
|
+
client(event, data) {
|
|
43
|
+
this.write({ ts: new Date().toISOString(), src: 'C', ev: event, ...(data ? { d: data } : {}) });
|
|
44
|
+
}
|
|
45
|
+
/** Client-side decision log with original client timestamp preserved. */
|
|
46
|
+
clientWithTs(ts, event, data) {
|
|
47
|
+
this.write({ ts, src: 'C', ev: event, ...(data ? { d: data } : {}) });
|
|
48
|
+
}
|
|
49
|
+
close() {
|
|
50
|
+
try {
|
|
51
|
+
this.stream?.end();
|
|
52
|
+
}
|
|
53
|
+
catch { /* ignore */ }
|
|
54
|
+
this.stream = null;
|
|
55
|
+
}
|
|
56
|
+
write(entry) {
|
|
57
|
+
if (!this.stream)
|
|
58
|
+
return;
|
|
59
|
+
try {
|
|
60
|
+
this.stream.write(JSON.stringify(entry) + '\n');
|
|
61
|
+
}
|
|
62
|
+
catch { /* best-effort */ }
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=cliDebugLog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliDebugLog.js","sourceRoot":"","sources":["../../src/utils/cliDebugLog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAoB,MAAM,IAAI,CAAC;AACpE,OAAO,IAAI,MAAM,MAAM,CAAC;AASxB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AAE9D,MAAM,OAAO,WAAW;IACd,MAAM,GAAuB,IAAI,CAAC;IACjC,QAAQ,CAAS;IAE1B,YAAY,SAAiB;QAC3B,MAAM,GAAG,GAAG,SAAS,IAAI,SAAS,CAAC;QACnC,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;QAC3C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,IAAI,CAAC,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACvE,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,MAAM,CAAC,KAAa,EAAE,IAA8B;QAClD,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAClG,CAAC;IAED,kEAAkE;IAClE,MAAM,CAAC,KAAa,EAAE,IAA8B;QAClD,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAClG,CAAC;IAED,yEAAyE;IACzE,YAAY,CAAC,EAAU,EAAE,KAAa,EAAE,IAA8B;QACpE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,KAAK;QACH,IAAI,CAAC;YAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,KAAuB;QACnC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Engine Utilities (Epic 33)
|
|
3
|
+
* Small pure helpers for the CLI conversation engine's call-site gating logic.
|
|
4
|
+
*/
|
|
5
|
+
import type { EngineMode } from '@hammoc/shared';
|
|
6
|
+
/**
|
|
7
|
+
* Decide whether to forward the CLI engine's generation-progress callback
|
|
8
|
+
* (the "↓ N tokens · Ns" spinner counter, Story 32.7) to the browser.
|
|
9
|
+
*
|
|
10
|
+
* Gated on two conditions (Story 33.3):
|
|
11
|
+
* 1. the effective engine is the CLI engine (the SDK engine ignores the callback
|
|
12
|
+
* anyway — real token streaming makes a counter unnecessary), and
|
|
13
|
+
* 2. the user's `cliShowGenerationProgress` preference is enabled (default ON when
|
|
14
|
+
* unset — Story 33.2).
|
|
15
|
+
*
|
|
16
|
+
* When this returns false the call site passes `undefined`, so the engine's
|
|
17
|
+
* `emitProgress` early-returns and no `generation:progress` event is emitted.
|
|
18
|
+
*/
|
|
19
|
+
export declare function shouldForwardCliProgress(engineMode: EngineMode, showProgressPref: boolean | undefined): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Decide whether to forward the CLI engine's raw-screen passthrough (the read-only PTY
|
|
22
|
+
* mirror) to the browser.
|
|
23
|
+
*
|
|
24
|
+
* Gated on two conditions:
|
|
25
|
+
* 1. the effective engine is the CLI engine (the SDK engine has no PTY and never
|
|
26
|
+
* calls the callback anyway), and
|
|
27
|
+
* 2. the user's `cliPtyMirror` preference is enabled (default ON when unset — Story
|
|
28
|
+
* 37.7 promoted the mirror from a diagnostic opt-in to a default feature; the
|
|
29
|
+
* `false` opt-out is still honored so a user can turn it off).
|
|
30
|
+
*
|
|
31
|
+
* When this returns false the call site passes `undefined`, so the engine's onData never
|
|
32
|
+
* invokes onScreenFrame and no `cli:screen-frame` event is emitted.
|
|
33
|
+
*/
|
|
34
|
+
export declare function shouldForwardCliPtyMirror(engineMode: EngineMode, mirrorPref: boolean | undefined): boolean;
|
|
35
|
+
//# sourceMappingURL=cliEngineUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliEngineUtils.d.ts","sourceRoot":"","sources":["../../src/utils/cliEngineUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,UAAU,EACtB,gBAAgB,EAAE,OAAO,GAAG,SAAS,GACpC,OAAO,CAET;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,OAAO,GAAG,SAAS,GAC9B,OAAO,CAET"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Engine Utilities (Epic 33)
|
|
3
|
+
* Small pure helpers for the CLI conversation engine's call-site gating logic.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Decide whether to forward the CLI engine's generation-progress callback
|
|
7
|
+
* (the "↓ N tokens · Ns" spinner counter, Story 32.7) to the browser.
|
|
8
|
+
*
|
|
9
|
+
* Gated on two conditions (Story 33.3):
|
|
10
|
+
* 1. the effective engine is the CLI engine (the SDK engine ignores the callback
|
|
11
|
+
* anyway — real token streaming makes a counter unnecessary), and
|
|
12
|
+
* 2. the user's `cliShowGenerationProgress` preference is enabled (default ON when
|
|
13
|
+
* unset — Story 33.2).
|
|
14
|
+
*
|
|
15
|
+
* When this returns false the call site passes `undefined`, so the engine's
|
|
16
|
+
* `emitProgress` early-returns and no `generation:progress` event is emitted.
|
|
17
|
+
*/
|
|
18
|
+
export function shouldForwardCliProgress(engineMode, showProgressPref) {
|
|
19
|
+
return engineMode === 'cli' && (showProgressPref ?? true);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Decide whether to forward the CLI engine's raw-screen passthrough (the read-only PTY
|
|
23
|
+
* mirror) to the browser.
|
|
24
|
+
*
|
|
25
|
+
* Gated on two conditions:
|
|
26
|
+
* 1. the effective engine is the CLI engine (the SDK engine has no PTY and never
|
|
27
|
+
* calls the callback anyway), and
|
|
28
|
+
* 2. the user's `cliPtyMirror` preference is enabled (default ON when unset — Story
|
|
29
|
+
* 37.7 promoted the mirror from a diagnostic opt-in to a default feature; the
|
|
30
|
+
* `false` opt-out is still honored so a user can turn it off).
|
|
31
|
+
*
|
|
32
|
+
* When this returns false the call site passes `undefined`, so the engine's onData never
|
|
33
|
+
* invokes onScreenFrame and no `cli:screen-frame` event is emitted.
|
|
34
|
+
*/
|
|
35
|
+
export function shouldForwardCliPtyMirror(engineMode, mirrorPref) {
|
|
36
|
+
return engineMode === 'cli' && (mirrorPref ?? true);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=cliEngineUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliEngineUtils.js","sourceRoot":"","sources":["../../src/utils/cliEngineUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,wBAAwB,CACtC,UAAsB,EACtB,gBAAqC;IAErC,OAAO,UAAU,KAAK,KAAK,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,yBAAyB,CACvC,UAAsB,EACtB,UAA+B;IAE/B,OAAO,UAAU,KAAK,KAAK,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effortUtils.d.ts","sourceRoot":"","sources":["../../src/utils/effortUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"effortUtils.d.ts","sourceRoot":"","sources":["../../src/utils/effortUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAW7H;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAO3E"}
|
|
@@ -12,8 +12,9 @@ export function clampEffortForModel(effort, model) {
|
|
|
12
12
|
if (!effort)
|
|
13
13
|
return effort;
|
|
14
14
|
const supportsMax = !!model && (model === 'opus' || model === 'sonnet' ||
|
|
15
|
-
model.includes('opus-4-6') || model.includes('opus-4-7') || model.includes('opus-4-8') || model.includes('sonnet-4-6')
|
|
16
|
-
|
|
15
|
+
model.includes('opus-4-6') || model.includes('opus-4-7') || model.includes('opus-4-8') || model.includes('sonnet-4-6') ||
|
|
16
|
+
model.includes('fable'));
|
|
17
|
+
const supportsXHigh = !!model && (model === 'opus' || model.includes('opus-4-7') || model.includes('opus-4-8') || model.includes('fable'));
|
|
17
18
|
if (effort === 'max' && !supportsMax)
|
|
18
19
|
return 'high';
|
|
19
20
|
if (effort === 'xhigh' && !supportsXHigh)
|
|
@@ -31,6 +32,7 @@ export function supportsAdaptiveThinking(model) {
|
|
|
31
32
|
if (!model)
|
|
32
33
|
return false;
|
|
33
34
|
return (model === 'opus' || model === 'sonnet' ||
|
|
34
|
-
model.includes('opus-4-6') || model.includes('opus-4-7') || model.includes('opus-4-8') || model.includes('sonnet-4-6')
|
|
35
|
+
model.includes('opus-4-6') || model.includes('opus-4-7') || model.includes('opus-4-8') || model.includes('sonnet-4-6') ||
|
|
36
|
+
model.includes('fable'));
|
|
35
37
|
}
|
|
36
38
|
//# sourceMappingURL=effortUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effortUtils.js","sourceRoot":"","sources":["../../src/utils/effortUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAkC,EAAE,KAAyB;IAC/F,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,IAAI,CAC7B,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ;QACtC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"effortUtils.js","sourceRoot":"","sources":["../../src/utils/effortUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAkC,EAAE,KAAyB;IAC/F,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,IAAI,CAC7B,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ;QACtC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;QACtH,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CACxB,CAAC;IACF,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3I,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,WAAW;QAAE,OAAO,MAAM,CAAC;IACpD,IAAI,MAAM,KAAK,OAAO,IAAI,CAAC,aAAa;QAAE,OAAO,MAAM,CAAC;IACxD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAyB;IAChE,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,CACL,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ;QACtC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;QACtH,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CACxB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trailing-edge throttle (Story 37.8) — paces CLI mirror screen frames so a burst of PTY
|
|
3
|
+
* redraws (the spinner repaints many times a second) collapses to at most one send per
|
|
4
|
+
* interval, while still guaranteeing the LATEST frame in the burst is delivered.
|
|
5
|
+
*
|
|
6
|
+
* Semantics:
|
|
7
|
+
* - `schedule(value)` — leading edge: if nothing fired within the interval, run `fn`
|
|
8
|
+
* immediately; otherwise stash `value` as pending and run it once when the interval
|
|
9
|
+
* elapses (trailing edge, always the most recent value).
|
|
10
|
+
* - `cancel()` — drop any pending value and clear the timer. Called at turn teardown,
|
|
11
|
+
* which then sends the final screen directly (outside the throttle) so the last frame
|
|
12
|
+
* is never lost to an unelapsed interval.
|
|
13
|
+
*
|
|
14
|
+
* Pure / timer-only: no xterm or socket coupling, so it unit-tests with fake timers.
|
|
15
|
+
*/
|
|
16
|
+
export interface TrailingThrottle<T> {
|
|
17
|
+
schedule(value: T): void;
|
|
18
|
+
cancel(): void;
|
|
19
|
+
}
|
|
20
|
+
export declare function createTrailingThrottle<T>(intervalMs: number, fn: (value: T) => void): TrailingThrottle<T>;
|
|
21
|
+
//# sourceMappingURL=trailingThrottle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trailingThrottle.d.ts","sourceRoot":"","sources":["../../src/utils/trailingThrottle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACzB,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GACrB,gBAAgB,CAAC,CAAC,CAAC,CAoCrB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function createTrailingThrottle(intervalMs, fn) {
|
|
2
|
+
let timer = null;
|
|
3
|
+
let pending = null;
|
|
4
|
+
const fire = (value) => {
|
|
5
|
+
// Open the cool-down window first; a schedule() during it stashes `pending`, which the
|
|
6
|
+
// trailing timer below flushes. Then run fn.
|
|
7
|
+
timer = setTimeout(onInterval, intervalMs);
|
|
8
|
+
fn(value);
|
|
9
|
+
};
|
|
10
|
+
function onInterval() {
|
|
11
|
+
timer = null;
|
|
12
|
+
if (pending) {
|
|
13
|
+
const { value } = pending;
|
|
14
|
+
pending = null;
|
|
15
|
+
fire(value); // trailing edge — re-opens the window so a steady stream keeps pacing
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
schedule(value) {
|
|
20
|
+
if (timer === null) {
|
|
21
|
+
fire(value); // leading edge — nothing in flight, send immediately
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
pending = { value }; // within the window — keep only the latest
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
cancel() {
|
|
28
|
+
if (timer !== null) {
|
|
29
|
+
clearTimeout(timer);
|
|
30
|
+
timer = null;
|
|
31
|
+
}
|
|
32
|
+
pending = null;
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=trailingThrottle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trailingThrottle.js","sourceRoot":"","sources":["../../src/utils/trailingThrottle.ts"],"names":[],"mappings":"AAoBA,MAAM,UAAU,sBAAsB,CACpC,UAAkB,EAClB,EAAsB;IAEtB,IAAI,KAAK,GAAyC,IAAI,CAAC;IACvD,IAAI,OAAO,GAAwB,IAAI,CAAC;IAExC,MAAM,IAAI,GAAG,CAAC,KAAQ,EAAQ,EAAE;QAC9B,uFAAuF;QACvF,6CAA6C;QAC7C,KAAK,GAAG,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC3C,EAAE,CAAC,KAAK,CAAC,CAAC;IACZ,CAAC,CAAC;IAEF,SAAS,UAAU;QACjB,KAAK,GAAG,IAAI,CAAC;QACb,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;YAC1B,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,sEAAsE;QACrF,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ,CAAC,KAAQ;YACf,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,qDAAqD;YACpE,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,2CAA2C;YAClE,CAAC;QACH,CAAC;QACD,MAAM;YACJ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
|