hammoc 1.5.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 +12 -4
- package/package.json +2 -2
- package/packages/client/dist/assets/{agentExampleHighlight-BgwTm15v.js → agentExampleHighlight-7Olvqdpf.js} +1 -1
- package/packages/client/dist/assets/{commandTokenHighlight-BljHwnrK.js → commandTokenHighlight-DtKwh4lx.js} +1 -1
- package/packages/client/dist/assets/index-B09doO8H.js +139 -0
- package/packages/client/dist/assets/index-Bee52CKG.js +1569 -0
- package/packages/client/dist/assets/index-CVy582lU.css +32 -0
- package/packages/client/dist/assets/{index-D3LxqW3f.js → index-DLHBUw8c.js} +1 -1
- package/packages/client/dist/assets/{snippetTokenHighlight-DWsaQXX0.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/bmadCoreConfigController.d.ts +41 -0
- package/packages/server/dist/controllers/bmadCoreConfigController.d.ts.map +1 -0
- package/packages/server/dist/controllers/bmadCoreConfigController.js +172 -0
- package/packages/server/dist/controllers/bmadCoreConfigController.js.map +1 -0
- package/packages/server/dist/controllers/contextBuilderController.d.ts +43 -0
- package/packages/server/dist/controllers/contextBuilderController.d.ts.map +1 -0
- package/packages/server/dist/controllers/contextBuilderController.js +159 -0
- package/packages/server/dist/controllers/contextBuilderController.js.map +1 -0
- package/packages/server/dist/controllers/harnessAgentController.d.ts +7 -0
- package/packages/server/dist/controllers/harnessAgentController.d.ts.map +1 -1
- package/packages/server/dist/controllers/harnessAgentController.js +33 -0
- package/packages/server/dist/controllers/harnessAgentController.js.map +1 -1
- package/packages/server/dist/controllers/harnessBundleController.d.ts +37 -0
- package/packages/server/dist/controllers/harnessBundleController.d.ts.map +1 -0
- package/packages/server/dist/controllers/harnessBundleController.js +312 -0
- package/packages/server/dist/controllers/harnessBundleController.js.map +1 -0
- package/packages/server/dist/controllers/harnessCommandController.d.ts +7 -0
- package/packages/server/dist/controllers/harnessCommandController.d.ts.map +1 -1
- package/packages/server/dist/controllers/harnessCommandController.js +33 -0
- package/packages/server/dist/controllers/harnessCommandController.js.map +1 -1
- package/packages/server/dist/controllers/harnessHookController.d.ts.map +1 -1
- package/packages/server/dist/controllers/harnessHookController.js +44 -1
- package/packages/server/dist/controllers/harnessHookController.js.map +1 -1
- package/packages/server/dist/controllers/harnessMcpController.d.ts.map +1 -1
- package/packages/server/dist/controllers/harnessMcpController.js +62 -1
- package/packages/server/dist/controllers/harnessMcpController.js.map +1 -1
- package/packages/server/dist/controllers/harnessShareScopeController.d.ts +9 -0
- package/packages/server/dist/controllers/harnessShareScopeController.d.ts.map +1 -1
- package/packages/server/dist/controllers/harnessShareScopeController.js +48 -1
- package/packages/server/dist/controllers/harnessShareScopeController.js.map +1 -1
- package/packages/server/dist/controllers/marketplaceController.d.ts +19 -0
- package/packages/server/dist/controllers/marketplaceController.d.ts.map +1 -0
- package/packages/server/dist/controllers/marketplaceController.js +74 -0
- package/packages/server/dist/controllers/marketplaceController.js.map +1 -0
- package/packages/server/dist/controllers/observabilityController.d.ts +32 -0
- package/packages/server/dist/controllers/observabilityController.d.ts.map +1 -0
- package/packages/server/dist/controllers/observabilityController.js +148 -0
- package/packages/server/dist/controllers/observabilityController.js.map +1 -0
- 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 +10 -0
- package/packages/server/dist/handlers/streamCallbacks.d.ts.map +1 -1
- package/packages/server/dist/handlers/streamCallbacks.js +25 -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 +385 -93
- 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/harness.d.ts.map +1 -1
- package/packages/server/dist/routes/harness.js +58 -0
- package/packages/server/dist/routes/harness.js.map +1 -1
- 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/bmadCoreConfigService.d.ts +86 -0
- package/packages/server/dist/services/bmadCoreConfigService.d.ts.map +1 -0
- package/packages/server/dist/services/bmadCoreConfigService.js +175 -0
- package/packages/server/dist/services/bmadCoreConfigService.js.map +1 -0
- package/packages/server/dist/services/bmadStatusService.d.ts +9 -0
- package/packages/server/dist/services/bmadStatusService.d.ts.map +1 -1
- package/packages/server/dist/services/bmadStatusService.js +77 -13
- 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 +44 -104
- 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/contextBuilderScriptTemplate.d.ts +24 -0
- package/packages/server/dist/services/contextBuilderScriptTemplate.d.ts.map +1 -0
- package/packages/server/dist/services/contextBuilderScriptTemplate.js +181 -0
- package/packages/server/dist/services/contextBuilderScriptTemplate.js.map +1 -0
- package/packages/server/dist/services/contextBuilderService.d.ts +68 -0
- package/packages/server/dist/services/contextBuilderService.d.ts.map +1 -0
- package/packages/server/dist/services/contextBuilderService.js +345 -0
- package/packages/server/dist/services/contextBuilderService.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/fileWatcherService.d.ts.map +1 -1
- package/packages/server/dist/services/fileWatcherService.js +40 -0
- package/packages/server/dist/services/fileWatcherService.js.map +1 -1
- package/packages/server/dist/services/harnessAgentService.d.ts +18 -0
- package/packages/server/dist/services/harnessAgentService.d.ts.map +1 -1
- package/packages/server/dist/services/harnessAgentService.js +55 -0
- package/packages/server/dist/services/harnessAgentService.js.map +1 -1
- package/packages/server/dist/services/harnessBundleService.d.ts +145 -0
- package/packages/server/dist/services/harnessBundleService.d.ts.map +1 -0
- package/packages/server/dist/services/harnessBundleService.js +1318 -0
- package/packages/server/dist/services/harnessBundleService.js.map +1 -0
- package/packages/server/dist/services/harnessCommandService.d.ts +21 -0
- package/packages/server/dist/services/harnessCommandService.d.ts.map +1 -1
- package/packages/server/dist/services/harnessCommandService.js +64 -0
- package/packages/server/dist/services/harnessCommandService.js.map +1 -1
- package/packages/server/dist/services/harnessHookService.d.ts +27 -0
- package/packages/server/dist/services/harnessHookService.d.ts.map +1 -1
- package/packages/server/dist/services/harnessHookService.js +52 -0
- package/packages/server/dist/services/harnessHookService.js.map +1 -1
- package/packages/server/dist/services/harnessMcpService.d.ts +24 -1
- package/packages/server/dist/services/harnessMcpService.d.ts.map +1 -1
- package/packages/server/dist/services/harnessMcpService.js +70 -0
- package/packages/server/dist/services/harnessMcpService.js.map +1 -1
- package/packages/server/dist/services/harnessShareScopeService.d.ts +19 -0
- package/packages/server/dist/services/harnessShareScopeService.d.ts.map +1 -1
- package/packages/server/dist/services/harnessShareScopeService.js +65 -0
- package/packages/server/dist/services/harnessShareScopeService.js.map +1 -1
- 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/issueService.d.ts.map +1 -1
- package/packages/server/dist/services/issueService.js +1 -0
- package/packages/server/dist/services/issueService.js.map +1 -1
- package/packages/server/dist/services/marketplaceService.d.ts +50 -0
- package/packages/server/dist/services/marketplaceService.d.ts.map +1 -0
- package/packages/server/dist/services/marketplaceService.js +326 -0
- package/packages/server/dist/services/marketplaceService.js.map +1 -0
- package/packages/server/dist/services/observabilityService.d.ts +87 -0
- package/packages/server/dist/services/observabilityService.d.ts.map +1 -0
- package/packages/server/dist/services/observabilityService.js +0 -0
- package/packages/server/dist/services/observabilityService.js.map +1 -0
- 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 +12 -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/sessionService.d.ts +16 -0
- package/packages/server/dist/services/sessionService.d.ts.map +1 -1
- package/packages/server/dist/services/sessionService.js +125 -0
- package/packages/server/dist/services/sessionService.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/tokenCountService.d.ts +71 -0
- package/packages/server/dist/services/tokenCountService.d.ts.map +1 -0
- package/packages/server/dist/services/tokenCountService.js +313 -0
- package/packages/server/dist/services/tokenCountService.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/apply-qa-fixes +7 -5
- package/packages/server/dist/snippets/qa-review +7 -1
- package/packages/server/dist/utils/assertSafeBundlePath.d.ts +29 -0
- package/packages/server/dist/utils/assertSafeBundlePath.d.ts.map +1 -0
- package/packages/server/dist/utils/assertSafeBundlePath.js +53 -0
- package/packages/server/dist/utils/assertSafeBundlePath.js.map +1 -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 +14 -0
- package/packages/server/dist/utils/bundledBinaryModelSupport.d.ts.map +1 -0
- package/packages/server/dist/utils/bundledBinaryModelSupport.js +112 -0
- package/packages/server/dist/utils/bundledBinaryModelSupport.js.map +1 -0
- 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 +2 -2
- package/packages/server/dist/utils/effortUtils.d.ts.map +1 -1
- package/packages/server/dist/utils/effortUtils.js +7 -5
- package/packages/server/dist/utils/effortUtils.js.map +1 -1
- package/packages/server/dist/utils/errors.d.ts +1 -0
- package/packages/server/dist/utils/errors.d.ts.map +1 -1
- package/packages/server/dist/utils/errors.js +17 -0
- package/packages/server/dist/utils/errors.js.map +1 -1
- package/packages/server/dist/utils/harnessBundleSchema.d.ts +14 -12
- package/packages/server/dist/utils/harnessBundleSchema.d.ts.map +1 -1
- package/packages/server/dist/utils/harnessBundleSchema.js +11 -1
- package/packages/server/dist/utils/harnessBundleSchema.js.map +1 -1
- package/packages/server/dist/utils/harnessPaths.d.ts +40 -0
- package/packages/server/dist/utils/harnessPaths.d.ts.map +1 -1
- package/packages/server/dist/utils/harnessPaths.js +123 -0
- package/packages/server/dist/utils/harnessPaths.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 -58
- package/packages/server/resources/internals/INDEX.md +3 -1
- package/packages/server/resources/internals/bmad-qa-fix-marker.md +32 -0
- package/packages/server/resources/internals/harness-files.md +22 -0
- package/packages/server/resources/internals/image-storage.md +9 -0
- package/packages/server/resources/internals/observability-storage.md +23 -0
- package/packages/server/resources/manual/02-chat.md +23 -4
- package/packages/server/resources/manual/03-sessions.md +1 -0
- package/packages/server/resources/manual/05-projects.md +15 -2
- package/packages/server/resources/manual/10-project-board.md +4 -3
- package/packages/server/resources/manual/11-bmad-method-integration.md +12 -8
- package/packages/server/resources/manual/12-harness-workbench.md +82 -1
- package/packages/server/resources/manual/13-settings.md +61 -9
- package/packages/shared/dist/index.d.ts +7 -0
- package/packages/shared/dist/index.d.ts.map +1 -1
- package/packages/shared/dist/index.js +14 -0
- package/packages/shared/dist/index.js.map +1 -1
- package/packages/shared/dist/types/bmadCoreConfig.d.ts +71 -0
- package/packages/shared/dist/types/bmadCoreConfig.d.ts.map +1 -0
- package/packages/shared/dist/types/bmadCoreConfig.js +30 -0
- package/packages/shared/dist/types/bmadCoreConfig.js.map +1 -0
- package/packages/shared/dist/types/bmadStatus.d.ts +26 -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/board.d.ts +6 -0
- package/packages/shared/dist/types/board.d.ts.map +1 -1
- package/packages/shared/dist/types/contextBuilder.d.ts +102 -0
- package/packages/shared/dist/types/contextBuilder.d.ts.map +1 -0
- package/packages/shared/dist/types/contextBuilder.js +55 -0
- package/packages/shared/dist/types/contextBuilder.js.map +1 -0
- package/packages/shared/dist/types/harnessBundle.d.ts +35 -0
- package/packages/shared/dist/types/harnessBundle.d.ts.map +1 -1
- package/packages/shared/dist/types/marketplace.d.ts +83 -0
- package/packages/shared/dist/types/marketplace.d.ts.map +1 -0
- package/packages/shared/dist/types/marketplace.js +18 -0
- package/packages/shared/dist/types/marketplace.js.map +1 -0
- package/packages/shared/dist/types/observability.d.ts +148 -0
- package/packages/shared/dist/types/observability.d.ts.map +1 -0
- package/packages/shared/dist/types/observability.js +24 -0
- package/packages/shared/dist/types/observability.js.map +1 -0
- package/packages/shared/dist/types/preferences.d.ts +16 -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 +124 -12
- 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-CjyjnXB8.css +0 -32
- package/packages/client/dist/assets/index-NqJdhlek.js +0 -1498
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Story 31.4: Plugin marketplace catalog service (read-only).
|
|
3
|
+
*
|
|
4
|
+
* Surfaces the *full* `plugins[]` catalog from each registered marketplace —
|
|
5
|
+
* the entries Story 28.1 `harnessPluginService.listCards` deliberately discards
|
|
6
|
+
* (it keeps only installed cards). Builds a unified catalog by reading:
|
|
7
|
+
* - `plugins/known_marketplaces.json` → registered market names
|
|
8
|
+
* - `plugins/marketplaces/<name>/.claude-plugin/marketplace.json` → plugins[]
|
|
9
|
+
* - `plugins/installed_plugins.json` → installed flag join (AC1.d)
|
|
10
|
+
*
|
|
11
|
+
* Design constraints (Story 31.4):
|
|
12
|
+
* - 28.1 `harnessPluginService` is NOT modified — this is a separate
|
|
13
|
+
* read-only service so the stable toggle/list path cannot regress.
|
|
14
|
+
* - Per-market parse failures are isolated into `errors[]` instead of
|
|
15
|
+
* aborting the whole catalog (AC5) — unlike 28.1 which re-throws.
|
|
16
|
+
* - Plugin type is decided by the `source` path prefix (AC1.c), not by
|
|
17
|
+
* component counts, because unbuilt catalog entries have no installPath.
|
|
18
|
+
* - Component counts are reimplemented here (not extracted from 28.1) so the
|
|
19
|
+
* stable service is untouched and because the input is a *market repo
|
|
20
|
+
* source dir*, not an installPath. De-dup is an optional later cleanup.
|
|
21
|
+
* - All catalog file reads go through `harnessService.read` (traversal
|
|
22
|
+
* guard). Only the market repo source-dir enumeration uses direct `fs`,
|
|
23
|
+
* and refuses any path outside `~/.claude`.
|
|
24
|
+
*/
|
|
25
|
+
import path from 'path';
|
|
26
|
+
import fs from 'fs/promises';
|
|
27
|
+
import { HARNESS_ERRORS, } from '@hammoc/shared';
|
|
28
|
+
import { harnessService } from './harnessService.js';
|
|
29
|
+
import { projectService } from './projectService.js';
|
|
30
|
+
import { getUserHarnessRoot } from '../utils/harnessPaths.js';
|
|
31
|
+
/** installed_plugins.json `version` values this service understands (AC6). */
|
|
32
|
+
const KNOWN_INSTALLED_VERSIONS = new Set([1, 2]);
|
|
33
|
+
// --- helpers ---------------------------------------------------------------
|
|
34
|
+
function isFileNotFound(err) {
|
|
35
|
+
return err?.code === HARNESS_ERRORS.HARNESS_FILE_NOT_FOUND.code;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* AC1.c: type from `source` path prefix. `./external_plugins/...` → external
|
|
39
|
+
* MCP wrapper; everything else (`./plugins/...`) → standard.
|
|
40
|
+
*/
|
|
41
|
+
function decideTypeFromSource(source) {
|
|
42
|
+
const s = (source ?? '').replace(/^\.\//, '');
|
|
43
|
+
return s.startsWith('external_plugins/') ? 'external-mcp' : 'standard';
|
|
44
|
+
}
|
|
45
|
+
function samePath(a, b) {
|
|
46
|
+
const na = path.resolve(a);
|
|
47
|
+
const nb = path.resolve(b);
|
|
48
|
+
return process.platform === 'win32' ? na.toLowerCase() === nb.toLowerCase() : na === nb;
|
|
49
|
+
}
|
|
50
|
+
function isLikelyMcpServerEntry(value) {
|
|
51
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
52
|
+
return false;
|
|
53
|
+
const rec = value;
|
|
54
|
+
return (typeof rec.command === 'string'
|
|
55
|
+
|| typeof rec.url === 'string'
|
|
56
|
+
|| typeof rec.type === 'string'
|
|
57
|
+
|| typeof rec.transport === 'string');
|
|
58
|
+
}
|
|
59
|
+
// Component counters — reimplemented from 28.1 `countComponents` + 4 helpers.
|
|
60
|
+
// Kept private to this module (not shared util) per Story 31.4 A.1 rationale.
|
|
61
|
+
async function countSkillsDir(dir) {
|
|
62
|
+
try {
|
|
63
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
64
|
+
let n = 0;
|
|
65
|
+
for (const ent of entries) {
|
|
66
|
+
if (!ent.isDirectory())
|
|
67
|
+
continue;
|
|
68
|
+
try {
|
|
69
|
+
await fs.access(path.join(dir, ent.name, 'SKILL.md'));
|
|
70
|
+
n += 1;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// no SKILL.md → skip
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return n;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async function countMarkdownFiles(dir) {
|
|
83
|
+
try {
|
|
84
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
85
|
+
let n = 0;
|
|
86
|
+
for (const ent of entries) {
|
|
87
|
+
if (ent.isFile() && ent.name.toLowerCase().endsWith('.md'))
|
|
88
|
+
n += 1;
|
|
89
|
+
}
|
|
90
|
+
return n;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return 0;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function countHooksJson(file) {
|
|
97
|
+
try {
|
|
98
|
+
const content = await fs.readFile(file, 'utf-8');
|
|
99
|
+
const parsed = JSON.parse(content);
|
|
100
|
+
const hooks = parsed?.hooks;
|
|
101
|
+
if (!hooks || typeof hooks !== 'object')
|
|
102
|
+
return 0;
|
|
103
|
+
return Object.values(hooks)
|
|
104
|
+
.filter(Array.isArray)
|
|
105
|
+
.reduce((sum, arr) => sum + arr.length, 0);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return 0;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async function countMcpServers(file) {
|
|
112
|
+
try {
|
|
113
|
+
const content = await fs.readFile(file, 'utf-8');
|
|
114
|
+
const parsed = JSON.parse(content);
|
|
115
|
+
if (!parsed || typeof parsed !== 'object')
|
|
116
|
+
return 0;
|
|
117
|
+
const wrapper = parsed.mcpServers;
|
|
118
|
+
if (wrapper && typeof wrapper === 'object' && !Array.isArray(wrapper)) {
|
|
119
|
+
return Object.keys(wrapper).length;
|
|
120
|
+
}
|
|
121
|
+
let n = 0;
|
|
122
|
+
for (const value of Object.values(parsed)) {
|
|
123
|
+
if (isLikelyMcpServerEntry(value))
|
|
124
|
+
n += 1;
|
|
125
|
+
}
|
|
126
|
+
return n;
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return 0;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
class MarketplaceService {
|
|
133
|
+
/**
|
|
134
|
+
* Build the unified catalog. Never throws on per-market or installed-file
|
|
135
|
+
* problems — they degrade into `errors[]` / `formatWarning` (AC5/AC6).
|
|
136
|
+
*/
|
|
137
|
+
async listCatalog(currentProjectSlug) {
|
|
138
|
+
const currentProjectPath = await this.resolveCurrentProjectPath(currentProjectSlug);
|
|
139
|
+
const userRoot = path.resolve(getUserHarnessRoot());
|
|
140
|
+
// Step 1: known_marketplaces.json (absent or malformed → empty catalog).
|
|
141
|
+
let known = {};
|
|
142
|
+
try {
|
|
143
|
+
const res = await harnessService.read({
|
|
144
|
+
scope: 'user',
|
|
145
|
+
relativePath: 'plugins/known_marketplaces.json',
|
|
146
|
+
});
|
|
147
|
+
known = this.safeParse(res.content ?? '', {});
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
if (!isFileNotFound(err))
|
|
151
|
+
throw err;
|
|
152
|
+
return { marketplaces: [], entries: [], errors: [] };
|
|
153
|
+
}
|
|
154
|
+
const marketplaces = Object.keys(known).filter((k) => k && typeof k === 'string');
|
|
155
|
+
// Step 2+3: per-market marketplace.json → catalog entries; isolate failures.
|
|
156
|
+
const entries = [];
|
|
157
|
+
const errors = [];
|
|
158
|
+
for (const marketName of marketplaces) {
|
|
159
|
+
let raw;
|
|
160
|
+
try {
|
|
161
|
+
const res = await harnessService.read({
|
|
162
|
+
scope: 'user',
|
|
163
|
+
relativePath: `plugins/marketplaces/${marketName}/.claude-plugin/marketplace.json`,
|
|
164
|
+
});
|
|
165
|
+
raw = res.content ?? '';
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
errors.push({
|
|
169
|
+
marketplace: marketName,
|
|
170
|
+
code: isFileNotFound(err)
|
|
171
|
+
? HARNESS_ERRORS.HARNESS_FILE_NOT_FOUND.code
|
|
172
|
+
: HARNESS_ERRORS.HARNESS_PARSE_ERROR.code,
|
|
173
|
+
});
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
let meta;
|
|
177
|
+
try {
|
|
178
|
+
meta = JSON.parse(raw);
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
errors.push({ marketplace: marketName, code: HARNESS_ERRORS.HARNESS_PARSE_ERROR.code });
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
for (const plugin of meta.plugins ?? []) {
|
|
185
|
+
if (!plugin?.name)
|
|
186
|
+
continue;
|
|
187
|
+
const entry = {
|
|
188
|
+
key: `${plugin.name}@${marketName}`,
|
|
189
|
+
name: plugin.name,
|
|
190
|
+
marketplace: marketName,
|
|
191
|
+
description: plugin.description,
|
|
192
|
+
version: plugin.version,
|
|
193
|
+
author: plugin.author,
|
|
194
|
+
category: plugin.category,
|
|
195
|
+
pluginType: decideTypeFromSource(plugin.source),
|
|
196
|
+
source: plugin.source,
|
|
197
|
+
installed: false, // filled in step 4
|
|
198
|
+
};
|
|
199
|
+
const counts = await this.countComponentsForSource(userRoot, marketName, plugin.source);
|
|
200
|
+
if (counts)
|
|
201
|
+
entry.componentCounts = counts;
|
|
202
|
+
entries.push(entry);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Step 4: installed_plugins.json join + format warning (AC1.d / AC6).
|
|
206
|
+
const { installedKeys, formatWarning } = await this.readInstalledState(currentProjectPath);
|
|
207
|
+
for (const entry of entries) {
|
|
208
|
+
entry.installed = installedKeys.has(entry.key);
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
marketplaces,
|
|
212
|
+
entries,
|
|
213
|
+
errors,
|
|
214
|
+
...(formatWarning ? { formatWarning } : {}),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Read installed_plugins.json into a set of installed keys + an optional
|
|
219
|
+
* format warning. Absent file → no installs, no warning (normal). Unknown
|
|
220
|
+
* version / wrong shape / parse error → degrade with a warning (AC6).
|
|
221
|
+
*/
|
|
222
|
+
async readInstalledState(currentProjectPath) {
|
|
223
|
+
const installedKeys = new Set();
|
|
224
|
+
let content;
|
|
225
|
+
try {
|
|
226
|
+
const res = await harnessService.read({
|
|
227
|
+
scope: 'user',
|
|
228
|
+
relativePath: 'plugins/installed_plugins.json',
|
|
229
|
+
});
|
|
230
|
+
content = res.content ?? '';
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
if (isFileNotFound(err))
|
|
234
|
+
return { installedKeys };
|
|
235
|
+
throw err;
|
|
236
|
+
}
|
|
237
|
+
let parsed;
|
|
238
|
+
try {
|
|
239
|
+
parsed = JSON.parse(content);
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
return { installedKeys, formatWarning: { reason: 'parseError' } };
|
|
243
|
+
}
|
|
244
|
+
let formatWarning;
|
|
245
|
+
if (typeof parsed.version === 'number' && !KNOWN_INSTALLED_VERSIONS.has(parsed.version)) {
|
|
246
|
+
formatWarning = { detectedVersion: parsed.version, reason: 'unrecognizedVersion' };
|
|
247
|
+
}
|
|
248
|
+
const plugins = parsed.plugins;
|
|
249
|
+
if (plugins && typeof plugins === 'object' && !Array.isArray(plugins)) {
|
|
250
|
+
for (const [key, value] of Object.entries(plugins)) {
|
|
251
|
+
const arr = Array.isArray(value) ? value : [value];
|
|
252
|
+
const installed = arr.some((e) => {
|
|
253
|
+
if (!e || typeof e !== 'object')
|
|
254
|
+
return false;
|
|
255
|
+
if (e.scope === 'project') {
|
|
256
|
+
return (!!currentProjectPath
|
|
257
|
+
&& typeof e.projectPath === 'string'
|
|
258
|
+
&& samePath(e.projectPath, currentProjectPath));
|
|
259
|
+
}
|
|
260
|
+
// user scope (or unspecified) → globally installed
|
|
261
|
+
return true;
|
|
262
|
+
});
|
|
263
|
+
if (installed)
|
|
264
|
+
installedKeys.add(key);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
else if (plugins !== undefined) {
|
|
268
|
+
formatWarning = formatWarning ?? {
|
|
269
|
+
detectedVersion: typeof parsed.version === 'number' ? parsed.version : undefined,
|
|
270
|
+
reason: 'unexpectedShape',
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
return { installedKeys, formatWarning };
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Best-effort component tally from the cloned market repo source dir
|
|
277
|
+
* (`<userRoot>/plugins/marketplaces/<market>/<source>/`). Returns undefined
|
|
278
|
+
* when the dir is missing or resolves outside `~/.claude` (type badge still
|
|
279
|
+
* renders without counts).
|
|
280
|
+
*/
|
|
281
|
+
async countComponentsForSource(userRoot, marketName, source) {
|
|
282
|
+
if (!source || typeof source !== 'string')
|
|
283
|
+
return undefined;
|
|
284
|
+
const rel = source.replace(/^\.\//, '');
|
|
285
|
+
const abs = path.resolve(userRoot, 'plugins', 'marketplaces', marketName, rel);
|
|
286
|
+
// Refuse anything outside ~/.claude (defends against `..` in source).
|
|
287
|
+
if (abs !== userRoot && !abs.startsWith(userRoot + path.sep))
|
|
288
|
+
return undefined;
|
|
289
|
+
try {
|
|
290
|
+
const stat = await fs.stat(abs);
|
|
291
|
+
if (!stat.isDirectory())
|
|
292
|
+
return undefined;
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
return undefined;
|
|
296
|
+
}
|
|
297
|
+
const [skills, commands, agents, hooks, mcpServers] = await Promise.all([
|
|
298
|
+
countSkillsDir(path.join(abs, 'skills')),
|
|
299
|
+
countMarkdownFiles(path.join(abs, 'commands')),
|
|
300
|
+
countMarkdownFiles(path.join(abs, 'agents')),
|
|
301
|
+
countHooksJson(path.join(abs, 'hooks', 'hooks.json')),
|
|
302
|
+
countMcpServers(path.join(abs, '.mcp.json')),
|
|
303
|
+
]);
|
|
304
|
+
return { skills, commands, agents, hooks, mcpServers };
|
|
305
|
+
}
|
|
306
|
+
async resolveCurrentProjectPath(slug) {
|
|
307
|
+
if (!slug)
|
|
308
|
+
return undefined;
|
|
309
|
+
try {
|
|
310
|
+
return await projectService.resolveOriginalPath(slug);
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
return undefined;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
safeParse(content, fallback) {
|
|
317
|
+
try {
|
|
318
|
+
return JSON.parse(content);
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
return fallback;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
export const marketplaceService = new MarketplaceService();
|
|
326
|
+
//# sourceMappingURL=marketplaceService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplaceService.js","sourceRoot":"","sources":["../../src/services/marketplaceService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Story 31.3 (Task A.1 / A.2): Observability MCP-call persistence + collection.
|
|
3
|
+
*
|
|
4
|
+
* Backend = JSONL rolling log under `~/.hammoc/observability/<projectSlug>.jsonl`
|
|
5
|
+
* (spike #3, §16 — 30k records query in ~34ms; SQLite not needed; consistent
|
|
6
|
+
* with architecture §9 "file-based storage, no external DB" and the existing
|
|
7
|
+
* `~/.hammoc/` plaintext files). `~/.hammoc/` is a SIBLING of `.claude/` and
|
|
8
|
+
* therefore outside the harness whitelist, so we use direct `fs` here — exactly
|
|
9
|
+
* like `preferencesService` does for `~/.hammoc/preferences.json` (the
|
|
10
|
+
* `storageService` named in the epic does not exist; `fileSystemService` /
|
|
11
|
+
* direct fs is the real pattern, S-B).
|
|
12
|
+
*
|
|
13
|
+
* Records are append-only. Argument/result BODIES are never stored — only their
|
|
14
|
+
* UTF-8 byte sizes — so secrets/file contents cannot leak (AC-A1.c).
|
|
15
|
+
*
|
|
16
|
+
* Collection seam: `createMcpCallRecorder` returns a small per-stream stateful
|
|
17
|
+
* object that the shared callback builder (`buildStreamCallbacks`) drives via
|
|
18
|
+
* onToolUse / onToolResult / onTurnEnd. A record is appended EXACTLY ONCE per
|
|
19
|
+
* call at onToolResult; orphans (no result) are flushed once at turn end with
|
|
20
|
+
* null fields (S-A / N-A).
|
|
21
|
+
*/
|
|
22
|
+
import { type McpCallRecord, type McpCallAggregate, type ObservabilityQuery, type ObservabilityMcpCallsResponse, type ToolResult } from '@hammoc/shared';
|
|
23
|
+
/** Parse `mcp__<server>__<tool>` → `<server>`; built-ins → null (AC-A1.d). */
|
|
24
|
+
export declare function parseServerName(toolName: string): string | null;
|
|
25
|
+
/** UTF-8 byte length of an arbitrary value's JSON (args) — body discarded. */
|
|
26
|
+
export declare function argByteSize(input: unknown): number;
|
|
27
|
+
/** UTF-8 byte length of a tool result body (output ?? error ?? ''). */
|
|
28
|
+
export declare function resultByteSize(result: ToolResult): number;
|
|
29
|
+
declare class ObservabilityService {
|
|
30
|
+
/** Serializes appends so concurrent streams never interleave partial lines. */
|
|
31
|
+
private appendChain;
|
|
32
|
+
/** Last prune time per project (epoch ms) — throttles append-time prune. */
|
|
33
|
+
private lastPruneAt;
|
|
34
|
+
private dir;
|
|
35
|
+
private filePath;
|
|
36
|
+
/**
|
|
37
|
+
* Append one record (AC-A1.c). Serialized via an internal promise chain.
|
|
38
|
+
* Triggers a throttled prune so the retention window is enforced without
|
|
39
|
+
* startup wiring (AC-A3.b — "append 시점 또는 서버 기동 시 prune").
|
|
40
|
+
*/
|
|
41
|
+
recordCall(record: McpCallRecord): Promise<void>;
|
|
42
|
+
/** Throttled prune triggered from the append path. Fire-and-forget. */
|
|
43
|
+
private maybePrune;
|
|
44
|
+
/** Read + parse all records for a project (skips malformed lines). */
|
|
45
|
+
private readAll;
|
|
46
|
+
/**
|
|
47
|
+
* Query the log with filters + aggregation (AC-A1.b / AC-A2). Always applies
|
|
48
|
+
* the retention cutoff on read so expired records never surface even before a
|
|
49
|
+
* compaction runs.
|
|
50
|
+
*/
|
|
51
|
+
query(projectSlug: string, filter?: ObservabilityQuery): Promise<ObservabilityMcpCallsResponse>;
|
|
52
|
+
/**
|
|
53
|
+
* Drop records older than `retentionDays` and rewrite the file (AC-A3.b).
|
|
54
|
+
* Returns the number of records removed. Routed through the append chain so a
|
|
55
|
+
* rewrite never races a concurrent append.
|
|
56
|
+
*/
|
|
57
|
+
prune(projectSlug: string, retentionDays?: number): Promise<number>;
|
|
58
|
+
}
|
|
59
|
+
/** Aggregate by (serverName, toolName). Exported for unit tests. */
|
|
60
|
+
export declare function aggregate(records: McpCallRecord[]): McpCallAggregate[];
|
|
61
|
+
export declare const observabilityService: ObservabilityService;
|
|
62
|
+
/**
|
|
63
|
+
* Drives MCP-call collection from the shared callback builder. One instance per
|
|
64
|
+
* stream. Maintains an in-memory `toolUseId → start info` map so the two
|
|
65
|
+
* separately-fired callbacks (`onToolUse` has no result, `onToolResult` has no
|
|
66
|
+
* start time) can be joined into a single complete record with `durationMs`.
|
|
67
|
+
*
|
|
68
|
+
* Lifecycle (S-A / N-A):
|
|
69
|
+
* - onToolUse → buffer start info (no append).
|
|
70
|
+
* - onToolResult → append ONE complete record, delete the map entry.
|
|
71
|
+
* - onTurnEnd → flush remaining (orphan) entries as null-field records, clear.
|
|
72
|
+
* The map is therefore bounded to a single turn's lifetime (no leak).
|
|
73
|
+
*/
|
|
74
|
+
export interface McpCallRecorder {
|
|
75
|
+
onToolUse(toolUseId: string, toolName: string, input: unknown): void;
|
|
76
|
+
onToolResult(toolUseId: string, result: ToolResult, sessionId: string | undefined): void;
|
|
77
|
+
onTurnEnd(sessionId: string | undefined): void;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Create a recorder. `resolveProjectSlug` is a thunk (sync for the queue path
|
|
81
|
+
* where `this.projectSlug` is known; async for the browser path where the slug
|
|
82
|
+
* is resolved from the working directory). The resolved slug is memoized; until
|
|
83
|
+
* it resolves (or if it is null — no project context) appends are skipped.
|
|
84
|
+
*/
|
|
85
|
+
export declare function createMcpCallRecorder(resolveProjectSlug: () => string | null | undefined | Promise<string | null | undefined>): McpCallRecorder;
|
|
86
|
+
export {};
|
|
87
|
+
//# sourceMappingURL=observabilityService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observabilityService.d.ts","sourceRoot":"","sources":["../../src/services/observabilityService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,6BAA6B,EAClC,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AASxB,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK/D;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMlD;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAEzD;AAOD,cAAM,oBAAoB;IACxB,+EAA+E;IAC/E,OAAO,CAAC,WAAW,CAAoC;IACvD,4EAA4E;IAC5E,OAAO,CAAC,WAAW,CAA6B;IAEhD,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,QAAQ;IAIhB;;;;OAIG;IACG,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAetD,uEAAuE;YACzD,UAAU;IAYxB,sEAAsE;YACxD,OAAO;IAoBrB;;;;OAIG;IACG,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,6BAA6B,CAAC;IAsBzG;;;;OAIG;IACG,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,SAA+B,GAAG,OAAO,CAAC,MAAM,CAAC;CAehG;AAED,oEAAoE;AACpE,wBAAgB,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,gBAAgB,EAAE,CA4BtE;AAED,eAAO,MAAM,oBAAoB,sBAA6B,CAAC;AAM/D;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACrE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACzF,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;CAChD;AASD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,kBAAkB,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,GACvF,eAAe,CAmEjB"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observabilityService.js","sourceRoot":"","sources":["../../src/services/observabilityService.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* [Source: Story 3.1 - Task 2]
|
|
5
5
|
* [Extended: Story 3.6 - Task 2: Project creation service]
|
|
6
6
|
*/
|
|
7
|
-
import type { PromptHistoryData, PromptChainItem, ProjectInfo, ProjectSettings, UpdateProjectSettingsRequest, ProjectSettingsApiResponse, CreateProjectRequest, CreateProjectResponse, ValidatePathResponse } from '@hammoc/shared';
|
|
7
|
+
import type { PromptHistoryData, PromptChainItem, ProjectInfo, ProjectSettings, UpdateProjectSettingsRequest, ProjectSettingsApiResponse, CreateProjectRequest, CreateProjectResponse, ValidatePathResponse, EngineMode } from '@hammoc/shared';
|
|
8
8
|
/**
|
|
9
9
|
* ProjectService - Scans and lists Claude Code projects
|
|
10
10
|
*/
|
|
@@ -43,6 +43,18 @@ declare class ProjectService {
|
|
|
43
43
|
* redundant parseSessionsIndex() calls.
|
|
44
44
|
*/
|
|
45
45
|
private _buildEffectiveResponse;
|
|
46
|
+
/**
|
|
47
|
+
* Resolve the effective conversation engine mode for a project (Epic 33, Story 33.3).
|
|
48
|
+
*
|
|
49
|
+
* Engine-side counterpart to `_buildEffectiveResponse`'s `effectiveEngineMode`: both
|
|
50
|
+
* run through `computeEffectiveEngineMode`, so the override precedence has one source
|
|
51
|
+
* of truth. The three conversation call sites (main chat, rewind, queue) call this to
|
|
52
|
+
* decide which engine the factory instantiates.
|
|
53
|
+
*
|
|
54
|
+
* `originalPath` is the project's real filesystem path — the same value the factory
|
|
55
|
+
* receives as `workingDirectory`.
|
|
56
|
+
*/
|
|
57
|
+
getEffectiveEngineMode(originalPath: string): Promise<EngineMode>;
|
|
46
58
|
/**
|
|
47
59
|
* Returns project settings merged with global preferences.
|
|
48
60
|
* Calculates effective values and identifies which fields are overridden.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectService.d.ts","sourceRoot":"","sources":["../../src/services/projectService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,eAAe,EACf,4BAA4B,EAC5B,0BAA0B,EAC1B,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"projectService.d.ts","sourceRoot":"","sources":["../../src/services/projectService.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import os from 'os';
|
|
|
9
9
|
import fs from 'fs/promises';
|
|
10
10
|
import { existsSync } from 'fs';
|
|
11
11
|
import { fileURLToPath } from 'url';
|
|
12
|
+
import { DEFAULT_ENGINE_MODE } from '@hammoc/shared';
|
|
12
13
|
import { preferencesService } from './preferencesService.js';
|
|
13
14
|
import { createLogger } from '../utils/logger.js';
|
|
14
15
|
const log = createLogger('projectService');
|
|
@@ -17,6 +18,18 @@ const __filename = fileURLToPath(import.meta.url);
|
|
|
17
18
|
const __dirname = path.dirname(__filename);
|
|
18
19
|
const SERVER_PACKAGE_ROOT = path.resolve(__dirname, '..', '..');
|
|
19
20
|
const BMAD_RESOURCES_DIR = path.join(SERVER_PACKAGE_ROOT, 'resources', 'bmad-method');
|
|
21
|
+
/**
|
|
22
|
+
* Pure resolver for the effective conversation engine mode (Epic 33 SSoT).
|
|
23
|
+
*
|
|
24
|
+
* A project override wins over the global preference, which wins over the default.
|
|
25
|
+
*
|
|
26
|
+
* Extracted from the inline expression so both the settings API response
|
|
27
|
+
* (`_buildEffectiveResponse`) and the engine-side resolver (`getEffectiveEngineMode`)
|
|
28
|
+
* consume one expression and can never drift — the precedence logic has a single home.
|
|
29
|
+
*/
|
|
30
|
+
function computeEffectiveEngineMode(override, globalEngineMode) {
|
|
31
|
+
return override ?? globalEngineMode ?? DEFAULT_ENGINE_MODE;
|
|
32
|
+
}
|
|
20
33
|
/**
|
|
21
34
|
* Validate path for security (path traversal prevention)
|
|
22
35
|
* Cross-platform compatible (Windows, macOS, Linux)
|
|
@@ -270,14 +283,33 @@ class ProjectService {
|
|
|
270
283
|
_overrides.push('modelOverride');
|
|
271
284
|
if (projectSettings.permissionModeOverride !== undefined)
|
|
272
285
|
_overrides.push('permissionModeOverride');
|
|
286
|
+
if (projectSettings.engineModeOverride !== undefined)
|
|
287
|
+
_overrides.push('engineModeOverride');
|
|
273
288
|
return {
|
|
274
289
|
...projectSettings,
|
|
275
290
|
effectiveModel: projectSettings.modelOverride ?? globalPrefs.defaultModel ?? '',
|
|
276
291
|
effectivePermissionMode: projectSettings.permissionModeOverride
|
|
277
292
|
?? (globalPrefs.permissionMode === 'latest' ? (globalPrefs.lastPermissionMode ?? 'default') : (globalPrefs.permissionMode ?? 'default')),
|
|
293
|
+
effectiveEngineMode: computeEffectiveEngineMode(projectSettings.engineModeOverride, globalPrefs.engineMode),
|
|
278
294
|
_overrides,
|
|
279
295
|
};
|
|
280
296
|
}
|
|
297
|
+
/**
|
|
298
|
+
* Resolve the effective conversation engine mode for a project (Epic 33, Story 33.3).
|
|
299
|
+
*
|
|
300
|
+
* Engine-side counterpart to `_buildEffectiveResponse`'s `effectiveEngineMode`: both
|
|
301
|
+
* run through `computeEffectiveEngineMode`, so the override precedence has one source
|
|
302
|
+
* of truth. The three conversation call sites (main chat, rewind, queue) call this to
|
|
303
|
+
* decide which engine the factory instantiates.
|
|
304
|
+
*
|
|
305
|
+
* `originalPath` is the project's real filesystem path — the same value the factory
|
|
306
|
+
* receives as `workingDirectory`.
|
|
307
|
+
*/
|
|
308
|
+
async getEffectiveEngineMode(originalPath) {
|
|
309
|
+
const projectSettings = await this.readProjectSettings(originalPath);
|
|
310
|
+
const globalPrefs = await preferencesService.getEffectivePreferences();
|
|
311
|
+
return computeEffectiveEngineMode(projectSettings.engineModeOverride, globalPrefs.engineMode);
|
|
312
|
+
}
|
|
281
313
|
/**
|
|
282
314
|
* Returns project settings merged with global preferences.
|
|
283
315
|
* Calculates effective values and identifies which fields are overridden.
|