@kynetic-ai/spec 0.9.1 → 0.11.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 +2 -1
- package/dist/acp/client.d.ts +6 -1
- package/dist/acp/client.d.ts.map +1 -1
- package/dist/acp/client.js +7 -2
- package/dist/acp/client.js.map +1 -1
- package/dist/acp/framing.d.ts +12 -1
- package/dist/acp/framing.d.ts.map +1 -1
- package/dist/acp/framing.js +27 -4
- package/dist/acp/framing.js.map +1 -1
- package/dist/agent-runtime/dispatch.d.ts +292 -0
- package/dist/agent-runtime/dispatch.d.ts.map +1 -0
- package/dist/agent-runtime/dispatch.js +860 -0
- package/dist/agent-runtime/dispatch.js.map +1 -0
- package/dist/agent-runtime/index.d.ts +11 -0
- package/dist/agent-runtime/index.d.ts.map +1 -0
- package/dist/agent-runtime/index.js +11 -0
- package/dist/agent-runtime/index.js.map +1 -0
- package/dist/agent-runtime/invocation.d.ts +86 -0
- package/dist/agent-runtime/invocation.d.ts.map +1 -0
- package/dist/agent-runtime/invocation.js +442 -0
- package/dist/agent-runtime/invocation.js.map +1 -0
- package/dist/agent-runtime/prompts.d.ts +50 -0
- package/dist/agent-runtime/prompts.d.ts.map +1 -0
- package/dist/agent-runtime/prompts.js +108 -0
- package/dist/agent-runtime/prompts.js.map +1 -0
- package/dist/agents/spawner.d.ts.map +1 -1
- package/dist/agents/spawner.js +60 -4
- package/dist/agents/spawner.js.map +1 -1
- package/dist/cli/batch-exec.d.ts.map +1 -1
- package/dist/cli/batch-exec.js +140 -62
- package/dist/cli/batch-exec.js.map +1 -1
- package/dist/cli/batch-write-buffer.d.ts +141 -0
- package/dist/cli/batch-write-buffer.d.ts.map +1 -0
- package/dist/cli/batch-write-buffer.js +400 -0
- package/dist/cli/batch-write-buffer.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +20 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +831 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/inbox.d.ts.map +1 -1
- package/dist/cli/commands/inbox.js +46 -22
- package/dist/cli/commands/inbox.js.map +1 -1
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +1 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/item.d.ts.map +1 -1
- package/dist/cli/commands/item.js +22 -16
- package/dist/cli/commands/item.js.map +1 -1
- package/dist/cli/commands/log.js +1 -1
- package/dist/cli/commands/log.js.map +1 -1
- package/dist/cli/commands/meta.d.ts.map +1 -1
- package/dist/cli/commands/meta.js +168 -6
- package/dist/cli/commands/meta.js.map +1 -1
- package/dist/cli/commands/module.d.ts.map +1 -1
- package/dist/cli/commands/module.js +2 -1
- package/dist/cli/commands/module.js.map +1 -1
- package/dist/cli/commands/plan-import.js +19 -3
- package/dist/cli/commands/plan-import.js.map +1 -1
- package/dist/cli/commands/plan.d.ts.map +1 -1
- package/dist/cli/commands/plan.js +87 -43
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/ralph.d.ts +5 -56
- package/dist/cli/commands/ralph.d.ts.map +1 -1
- package/dist/cli/commands/ralph.js +52 -1502
- package/dist/cli/commands/ralph.js.map +1 -1
- package/dist/cli/commands/search.d.ts.map +1 -1
- package/dist/cli/commands/search.js +22 -13
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/serve.d.ts.map +1 -1
- package/dist/cli/commands/serve.js +70 -11
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/session/checkpoint.d.ts.map +1 -1
- package/dist/cli/commands/session/checkpoint.js +7 -2
- package/dist/cli/commands/session/checkpoint.js.map +1 -1
- package/dist/cli/commands/session/commands.d.ts.map +1 -1
- package/dist/cli/commands/session/commands.js +15 -0
- package/dist/cli/commands/session/commands.js.map +1 -1
- package/dist/cli/commands/session/context.d.ts.map +1 -1
- package/dist/cli/commands/session/context.js +10 -5
- package/dist/cli/commands/session/context.js.map +1 -1
- package/dist/cli/commands/session/log.d.ts +1 -0
- package/dist/cli/commands/session/log.d.ts.map +1 -1
- package/dist/cli/commands/session/log.js +124 -8
- package/dist/cli/commands/session/log.js.map +1 -1
- package/dist/cli/commands/session/stale-close.d.ts +17 -0
- package/dist/cli/commands/session/stale-close.d.ts.map +1 -0
- package/dist/cli/commands/session/stale-close.js +378 -0
- package/dist/cli/commands/session/stale-close.js.map +1 -0
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +95 -0
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/skill-crud.d.ts.map +1 -1
- package/dist/cli/commands/skill-crud.js +4 -3
- package/dist/cli/commands/skill-crud.js.map +1 -1
- package/dist/cli/commands/skill-diff.d.ts.map +1 -1
- package/dist/cli/commands/skill-diff.js +15 -0
- package/dist/cli/commands/skill-diff.js.map +1 -1
- package/dist/cli/commands/skill-install.d.ts.map +1 -1
- package/dist/cli/commands/skill-install.js +50 -18
- package/dist/cli/commands/skill-install.js.map +1 -1
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +536 -310
- package/dist/cli/commands/task.js.map +1 -1
- package/dist/cli/commands/tasks.js +1 -1
- package/dist/cli/commands/tasks.js.map +1 -1
- package/dist/cli/commands/triage.d.ts.map +1 -1
- package/dist/cli/commands/triage.js +37 -13
- package/dist/cli/commands/triage.js.map +1 -1
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +65 -25
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/help/content.d.ts.map +1 -1
- package/dist/cli/help/content.js +5 -0
- package/dist/cli/help/content.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +5 -1
- package/dist/cli/output.js.map +1 -1
- package/dist/daemon/project-context.ts +22 -0
- package/dist/daemon/routes/agent-dispatch.ts +279 -0
- package/dist/daemon/routes/items.ts +22 -0
- package/dist/daemon/routes/meta.ts +141 -1
- package/dist/daemon/routes/plans.ts +147 -0
- package/dist/daemon/routes/sessions.ts +180 -0
- package/dist/daemon/routes/tasks.ts +198 -0
- package/dist/daemon/routes/validation.ts +1 -1
- package/dist/daemon/server.ts +77 -21
- package/dist/daemon/websocket/handler.ts +67 -6
- package/dist/daemon/websocket/lifecycle.ts +19 -0
- package/dist/daemon/websocket/pubsub.ts +74 -3
- package/dist/export/html.d.ts.map +1 -1
- package/dist/export/html.js +5 -2
- package/dist/export/html.js.map +1 -1
- package/dist/export/triage.d.ts +1 -1
- package/dist/export/triage.d.ts.map +1 -1
- package/dist/export/triage.js +5 -3
- package/dist/export/triage.js.map +1 -1
- package/dist/parser/alignment.d.ts.map +1 -1
- package/dist/parser/alignment.js +10 -5
- package/dist/parser/alignment.js.map +1 -1
- package/dist/parser/assess.js +1 -1
- package/dist/parser/assess.js.map +1 -1
- package/dist/parser/config.d.ts +6 -6
- package/dist/parser/meta.d.ts.map +1 -1
- package/dist/parser/meta.js +9 -8
- package/dist/parser/meta.js.map +1 -1
- package/dist/parser/plan-document.d.ts +12 -12
- package/dist/parser/plans.d.ts +7 -0
- package/dist/parser/plans.d.ts.map +1 -1
- package/dist/parser/plans.js +100 -15
- package/dist/parser/plans.js.map +1 -1
- package/dist/parser/refs.d.ts +5 -0
- package/dist/parser/refs.d.ts.map +1 -1
- package/dist/parser/refs.js +17 -12
- package/dist/parser/refs.js.map +1 -1
- package/dist/parser/shadow.d.ts +1 -1
- package/dist/parser/shadow.d.ts.map +1 -1
- package/dist/parser/shadow.js +71 -4
- package/dist/parser/shadow.js.map +1 -1
- package/dist/parser/skill-render.d.ts.map +1 -1
- package/dist/parser/skill-render.js +6 -3
- package/dist/parser/skill-render.js.map +1 -1
- package/dist/parser/validate.d.ts.map +1 -1
- package/dist/parser/validate.js +35 -76
- package/dist/parser/validate.js.map +1 -1
- package/dist/parser/yaml.d.ts +24 -5
- package/dist/parser/yaml.d.ts.map +1 -1
- package/dist/parser/yaml.js +224 -64
- package/dist/parser/yaml.js.map +1 -1
- package/dist/schema/meta.d.ts +457 -119
- package/dist/schema/meta.d.ts.map +1 -1
- package/dist/schema/meta.js +56 -0
- package/dist/schema/meta.js.map +1 -1
- package/dist/schema/plan.d.ts +22 -22
- package/dist/schema/spec.d.ts +39 -39
- package/dist/schema/task.d.ts +43 -32
- package/dist/schema/task.d.ts.map +1 -1
- package/dist/schema/task.js +5 -0
- package/dist/schema/task.js.map +1 -1
- package/dist/sessions/store.d.ts +126 -0
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +440 -22
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +75 -17
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js +51 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/triage/actions.d.ts +1 -0
- package/dist/triage/actions.d.ts.map +1 -1
- package/dist/triage/actions.js +34 -7
- package/dist/triage/actions.js.map +1 -1
- package/dist/utils/commit.js +1 -1
- package/dist/utils/commit.js.map +1 -1
- package/dist/web-ui/_app/env.js +1 -0
- package/dist/web-ui/_app/immutable/assets/0.BJaYkGW2.css +1 -0
- package/dist/web-ui/_app/immutable/assets/9.SzGLxi4x.css +1 -0
- package/dist/web-ui/_app/immutable/assets/select-trigger.CV-KWLNP.css +1 -0
- package/dist/web-ui/_app/immutable/chunks/-lc0BifF.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/62JVKtnb.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/8RBjHMN1.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/B5LJFxqa.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/B5wTVqxm.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/B6VSmczZ.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/B8a0xDxR.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BEOQc37C.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BHtYorjv.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BJ0JX3ea.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BMuCqDX8.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BP352uRn.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BUZujXJ2.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BVA9Exy-.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BWET-efb.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BXkNecpt.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BYzrIfX8.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BkOJ8DkV.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BpuwufMc.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BwMO4RrG.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BysXJlZb.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/C076q4JN.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/C33JaVbg.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/CGtqifKp.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/CHDZZ7OG.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/CPPfDSei.js +5 -0
- package/dist/web-ui/_app/immutable/chunks/CUir3f4J.js +60 -0
- package/dist/web-ui/_app/immutable/chunks/Cncwi6fQ.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/CrCIbn0C.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/CwELQvbx.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/D3vxvonu.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/D6TVmR9T.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/D7LTux4W.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/D82RulSH.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/D9QNBZM2.js +2 -0
- package/dist/web-ui/_app/immutable/chunks/DAMmvwn4.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DAh4Wfku.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DAx07bEQ.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DBYE9jOd.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DOno4cA2.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DQA8NZIH.js +2 -0
- package/dist/web-ui/_app/immutable/chunks/DRfPm2bo.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DhQhksaB.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DjG7s6hm.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DjcCz-PU.js +2 -0
- package/dist/web-ui/_app/immutable/chunks/DkltRNvh.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DlaTnPKL.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DvA-KON-.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DxCk-KHc.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DzO4hlg9.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/Eo4gF7ih.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/ExCq5swK.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/T3zZGv51.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/XZumBYeP.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/_ySfNjkF.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/iEtR5cV6.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/k_Qegko0.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/pE6cYWlS.js +1 -0
- package/dist/web-ui/_app/immutable/entry/app.Cgu6uKeS.js +2 -0
- package/dist/web-ui/_app/immutable/entry/start.9XifnLoB.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/0.DISwcKSK.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/1.Cx2Ufqp1.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/10.C3z8ijXL.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/11.DZdIjZmM.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/12.FsIGfAOa.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/13.DZoFwagf.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/14.DaIzDKbQ.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/15.BYyt4XWF.js +2 -0
- package/dist/web-ui/_app/immutable/nodes/16.CQkSqpOe.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/2.Bkf_j2UJ.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/3.kaMCurJG.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/4.BSsFPTHG.js +2 -0
- package/dist/web-ui/_app/immutable/nodes/5.CpPlcCEZ.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/6.BN4FqQmY.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/7.9kBYIZik.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/8.BuijtZ6B.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/9.C-Weba8R.js +1 -0
- package/dist/web-ui/_app/version.json +1 -0
- package/dist/web-ui/index.html +39 -0
- package/dist/web-ui/robots.txt +3 -0
- package/package.json +4 -2
- package/plugin/.claude-plugin/marketplace.json +1 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/plugins/kspec/skills/task-work/SKILL.md +25 -2
- package/templates/agents-sections/06-ralph-loop.md +64 -11
- package/templates/skills/task-work/SKILL.md +25 -2
- package/dist/ralph/cli-renderer.d.ts +0 -27
- package/dist/ralph/cli-renderer.d.ts.map +0 -1
- package/dist/ralph/cli-renderer.js +0 -250
- package/dist/ralph/cli-renderer.js.map +0 -1
- package/dist/ralph/events.d.ts +0 -65
- package/dist/ralph/events.d.ts.map +0 -1
- package/dist/ralph/events.js +0 -600
- package/dist/ralph/events.js.map +0 -1
- package/dist/ralph/index.d.ts +0 -11
- package/dist/ralph/index.d.ts.map +0 -1
- package/dist/ralph/index.js +0 -16
- package/dist/ralph/index.js.map +0 -1
- package/dist/ralph/loop-errors.d.ts +0 -83
- package/dist/ralph/loop-errors.d.ts.map +0 -1
- package/dist/ralph/loop-errors.js +0 -150
- package/dist/ralph/loop-errors.js.map +0 -1
- package/dist/ralph/subagent.d.ts +0 -127
- package/dist/ralph/subagent.d.ts.map +0 -1
- package/dist/ralph/subagent.js +0 -268
- package/dist/ralph/subagent.js.map +0 -1
- package/dist/ralph/wrap-up.d.ts +0 -127
- package/dist/ralph/wrap-up.d.ts.map +0 -1
- package/dist/ralph/wrap-up.js +0 -271
- package/dist/ralph/wrap-up.js.map +0 -1
package/dist/daemon/server.ts
CHANGED
|
@@ -10,9 +10,12 @@ import { cors } from '@elysiajs/cors';
|
|
|
10
10
|
import { staticPlugin } from '@elysiajs/static';
|
|
11
11
|
import { ulid } from 'ulidx';
|
|
12
12
|
import { existsSync } from 'fs';
|
|
13
|
+
import { fileURLToPath } from 'url';
|
|
14
|
+
import { dirname } from 'path';
|
|
13
15
|
import { PubSubManager } from './websocket/pubsub';
|
|
14
16
|
import { HeartbeatManager } from './websocket/heartbeat';
|
|
15
17
|
import { WebSocketHandler } from './websocket/handler';
|
|
18
|
+
import { handleWebSocketClose } from './websocket/lifecycle';
|
|
16
19
|
import type { ConnectionData, ConnectedEvent } from './websocket/types';
|
|
17
20
|
import { PidFileManager } from './pid';
|
|
18
21
|
import { projectContextMiddleware } from './middleware/project-context';
|
|
@@ -23,6 +26,9 @@ import { createMetaRoutes } from './routes/meta';
|
|
|
23
26
|
import { createValidationRoutes } from './routes/validation';
|
|
24
27
|
import { createProjectsRoutes } from './routes/projects';
|
|
25
28
|
import { createTriageRoutes } from './routes/triage';
|
|
29
|
+
import { createAgentDispatchRoutes, getDispatchEngine, stopAllEngines } from './routes/agent-dispatch';
|
|
30
|
+
import { createSessionRoutes } from './routes/sessions';
|
|
31
|
+
import { createPlansRoutes } from './routes/plans';
|
|
26
32
|
import { join } from 'path';
|
|
27
33
|
|
|
28
34
|
export interface ServerOptions {
|
|
@@ -39,8 +45,11 @@ export interface ServerOptions {
|
|
|
39
45
|
* 2. WEB_UI_DIR environment variable
|
|
40
46
|
* 3. packages/web-ui/build in current working directory (monorepo dev)
|
|
41
47
|
* 4. web-ui/build in current working directory
|
|
48
|
+
* 5. Bundled dist/web-ui/ relative to this module (npm package installs)
|
|
49
|
+
*
|
|
50
|
+
* Exported for testing only.
|
|
42
51
|
*/
|
|
43
|
-
function resolveWebUiPath(webUiDir?: string): string | null {
|
|
52
|
+
export function resolveWebUiPath(webUiDir?: string): string | null {
|
|
44
53
|
// 1. Explicit option
|
|
45
54
|
if (webUiDir && existsSync(webUiDir)) {
|
|
46
55
|
return webUiDir;
|
|
@@ -65,6 +74,15 @@ function resolveWebUiPath(webUiDir?: string): string | null {
|
|
|
65
74
|
return altPath;
|
|
66
75
|
}
|
|
67
76
|
|
|
77
|
+
// 5. Bundled assets: dist/web-ui/ relative to daemon module location
|
|
78
|
+
// Covers npm package installs where no local web UI build exists.
|
|
79
|
+
// import.meta.url resolves to dist/daemon/server.js → sibling is dist/web-ui/
|
|
80
|
+
const selfDir = dirname(fileURLToPath(import.meta.url));
|
|
81
|
+
const bundledPath = join(selfDir, '..', 'web-ui');
|
|
82
|
+
if (existsSync(bundledPath)) {
|
|
83
|
+
return bundledPath;
|
|
84
|
+
}
|
|
85
|
+
|
|
68
86
|
return null;
|
|
69
87
|
}
|
|
70
88
|
|
|
@@ -166,8 +184,10 @@ export async function createServer(options: ServerOptions) {
|
|
|
166
184
|
heartbeatManager = new HeartbeatManager();
|
|
167
185
|
wsHandler = new WebSocketHandler(pubsubManager);
|
|
168
186
|
|
|
169
|
-
// WeakMap to store project path during WebSocket upgrade
|
|
170
|
-
|
|
187
|
+
// WeakMap to store project path during WebSocket upgrade (keyed by Request object)
|
|
188
|
+
// Using WeakMap avoids needing to pass a requestId through beforeHandle return value,
|
|
189
|
+
// which breaks WebSocket upgrade in Elysia 1.4 when derive middleware is present.
|
|
190
|
+
const wsProjectPaths = new WeakMap<Request, string>();
|
|
171
191
|
|
|
172
192
|
const app = new Elysia()
|
|
173
193
|
// AC-15: Plugin pattern for middleware
|
|
@@ -222,6 +242,16 @@ export async function createServer(options: ServerOptions) {
|
|
|
222
242
|
// AC: @multi-directory-daemon ac-28, ac-29, ac-30 - Projects management endpoints
|
|
223
243
|
.use(createProjectsRoutes({ projectManager: projectContextManager }))
|
|
224
244
|
|
|
245
|
+
// AC: @ui-session-stream ac-1, ac-4 - Session data endpoints
|
|
246
|
+
.use(createSessionRoutes())
|
|
247
|
+
|
|
248
|
+
// AC: @ui-plans-view ac-1 - Plans data endpoints
|
|
249
|
+
.use(createPlansRoutes())
|
|
250
|
+
|
|
251
|
+
// AC: @agent-dispatch-engine ac-4 - Agent dispatch API endpoints
|
|
252
|
+
// AC: @daemon-agent-dispatch ac-3, ac-4 - Pass pubsub for WebSocket broadcast on invocation events
|
|
253
|
+
.use(createAgentDispatchRoutes({ pubsub: pubsubManager }))
|
|
254
|
+
|
|
225
255
|
// AC-4: WebSocket endpoint for real-time updates
|
|
226
256
|
.ws<ConnectionData>('/ws', {
|
|
227
257
|
beforeHandle({ request, store }) {
|
|
@@ -232,14 +262,17 @@ export async function createServer(options: ServerOptions) {
|
|
|
232
262
|
const projectPath = request.headers.get('X-Kspec-Dir')
|
|
233
263
|
|| url.searchParams.get('project')
|
|
234
264
|
|| undefined;
|
|
235
|
-
const requestId = ulid(); // Temporary ID to correlate upgrade with open
|
|
236
265
|
|
|
266
|
+
// IMPORTANT: Do NOT return a value from ws beforeHandle.
|
|
267
|
+
// In Elysia 1.4 with derive middleware, returning a value short-circuits
|
|
268
|
+
// the WebSocket upgrade and sends the value as an HTTP 200 response.
|
|
269
|
+
// Use a WeakMap keyed by Request object to pass data to open().
|
|
237
270
|
try {
|
|
238
271
|
const manager = (store as Record<string, unknown>).projectManager as import('./project-context').ProjectContextManager | undefined;
|
|
239
272
|
if (!manager) {
|
|
240
273
|
// Fallback: project manager not initialized yet
|
|
241
|
-
wsProjectPaths.set(
|
|
242
|
-
return
|
|
274
|
+
wsProjectPaths.set(request, startupProjectPath);
|
|
275
|
+
return;
|
|
243
276
|
}
|
|
244
277
|
|
|
245
278
|
let projectContext;
|
|
@@ -264,9 +297,8 @@ export async function createServer(options: ServerOptions) {
|
|
|
264
297
|
}
|
|
265
298
|
}
|
|
266
299
|
|
|
267
|
-
// Store resolved path for open() handler
|
|
268
|
-
wsProjectPaths.set(
|
|
269
|
-
return { wsRequestId: requestId };
|
|
300
|
+
// Store resolved path for open() handler via WeakMap
|
|
301
|
+
wsProjectPaths.set(request, projectContext.path);
|
|
270
302
|
} catch (err: unknown) {
|
|
271
303
|
console.error(`[daemon] WebSocket connection rejected: ${err instanceof Error ? err.message : String(err)}`);
|
|
272
304
|
throw err;
|
|
@@ -275,16 +307,13 @@ export async function createServer(options: ServerOptions) {
|
|
|
275
307
|
open(ws) {
|
|
276
308
|
// AC: @api-contract ac-25, @trait-websocket-protocol ac-1
|
|
277
309
|
const sessionId = ulid();
|
|
310
|
+
const openContext = ws.data as { id?: unknown; request?: unknown } | undefined;
|
|
311
|
+
const contextId = typeof openContext?.id === 'string' ? openContext.id : undefined;
|
|
278
312
|
|
|
279
313
|
// AC: @multi-directory-daemon ac-21 - Get bound project path
|
|
280
|
-
//
|
|
281
|
-
const
|
|
282
|
-
const projectPath =
|
|
283
|
-
|
|
284
|
-
// Clean up temporary mapping
|
|
285
|
-
if (requestId) {
|
|
286
|
-
wsProjectPaths.delete(requestId);
|
|
287
|
-
}
|
|
314
|
+
// Retrieve project path from WeakMap via the request object on ws.data
|
|
315
|
+
const request = openContext?.request as Request | undefined;
|
|
316
|
+
const projectPath = request ? wsProjectPaths.get(request) || startupProjectPath : startupProjectPath;
|
|
288
317
|
|
|
289
318
|
ws.data = {
|
|
290
319
|
sessionId,
|
|
@@ -295,7 +324,7 @@ export async function createServer(options: ServerOptions) {
|
|
|
295
324
|
projectPath // AC: @multi-directory-daemon ac-21 - immutable binding
|
|
296
325
|
};
|
|
297
326
|
|
|
298
|
-
pubsubManager.addConnection(sessionId, ws);
|
|
327
|
+
pubsubManager.addConnection(sessionId, ws, contextId);
|
|
299
328
|
console.log(`[daemon] WebSocket client connected: ${sessionId} bound to ${projectPath} (${pubsubManager.getConnectionCount()} total)`);
|
|
300
329
|
|
|
301
330
|
// Send connected event with session_id
|
|
@@ -316,8 +345,7 @@ export async function createServer(options: ServerOptions) {
|
|
|
316
345
|
heartbeatManager.recordPong(ws);
|
|
317
346
|
},
|
|
318
347
|
close(ws, code, reason) {
|
|
319
|
-
pubsubManager
|
|
320
|
-
console.log(`[daemon] WebSocket client disconnected: ${ws.data.sessionId} (code: ${code}, reason: ${reason})`);
|
|
348
|
+
handleWebSocketClose(pubsubManager, ws, code, reason);
|
|
321
349
|
}
|
|
322
350
|
});
|
|
323
351
|
|
|
@@ -335,7 +363,20 @@ export async function createServer(options: ServerOptions) {
|
|
|
335
363
|
|
|
336
364
|
// SPA fallback routes for client-side routing
|
|
337
365
|
// These catch paths like /tasks, /items, /inbox that don't have static files
|
|
338
|
-
const spaRoutes = [
|
|
366
|
+
const spaRoutes = [
|
|
367
|
+
'/tasks', '/tasks/*',
|
|
368
|
+
'/items', '/items/*',
|
|
369
|
+
'/inbox',
|
|
370
|
+
'/observations',
|
|
371
|
+
'/triage',
|
|
372
|
+
'/validate',
|
|
373
|
+
'/sessions', '/sessions/*',
|
|
374
|
+
'/agents',
|
|
375
|
+
'/specs',
|
|
376
|
+
'/workflows',
|
|
377
|
+
'/plans',
|
|
378
|
+
'/settings',
|
|
379
|
+
];
|
|
339
380
|
for (const route of spaRoutes) {
|
|
340
381
|
app.get(route, () => Bun.file(indexHtmlPath));
|
|
341
382
|
}
|
|
@@ -353,6 +394,18 @@ export async function createServer(options: ServerOptions) {
|
|
|
353
394
|
console.log(`[daemon] Server listening on http://localhost:${port} (IPv4: 127.0.0.1, IPv6: ::1)`);
|
|
354
395
|
console.log(`[daemon] WebSocket available at ws://localhost:${port}/ws`);
|
|
355
396
|
|
|
397
|
+
// AC: @agent-dispatch-engine ac-5 - Wire file change callback to dispatch engine
|
|
398
|
+
projectContextManager.setFileChangeCallback((projectPath, file) => {
|
|
399
|
+
// Only forward changes to project.tasks.yaml
|
|
400
|
+
if (!file.endsWith('project.tasks.yaml')) return;
|
|
401
|
+
const engine = getDispatchEngine(projectPath);
|
|
402
|
+
if (engine) {
|
|
403
|
+
engine.handleFileChange(projectPath).catch((err) => {
|
|
404
|
+
console.error('[dispatch] Error handling file change:', err);
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
|
|
356
409
|
// AC: @multi-directory-daemon ac-17 - Start file watcher for startup project
|
|
357
410
|
if (startupProjectPath) {
|
|
358
411
|
try {
|
|
@@ -374,6 +427,9 @@ export async function createServer(options: ServerOptions) {
|
|
|
374
427
|
// Stop heartbeat monitoring
|
|
375
428
|
heartbeatManager.stop();
|
|
376
429
|
|
|
430
|
+
// AC: @agent-dispatch-engine ac-11 - Stop all dispatch engines before shutting down
|
|
431
|
+
await stopAllEngines();
|
|
432
|
+
|
|
377
433
|
// AC: @multi-directory-daemon ac-11b - Stop all file watchers
|
|
378
434
|
await projectContextManager.stopAllWatchers();
|
|
379
435
|
console.log('[daemon] All file watchers stopped');
|
|
@@ -12,6 +12,49 @@ import type { ServerWebSocket } from 'bun';
|
|
|
12
12
|
import type { WebSocketCommand, CommandAck, ConnectionData } from './types';
|
|
13
13
|
import type { PubSubManager } from './pubsub';
|
|
14
14
|
|
|
15
|
+
type WebSocketRawMessage =
|
|
16
|
+
| string
|
|
17
|
+
| Buffer
|
|
18
|
+
| ArrayBuffer
|
|
19
|
+
| ArrayBufferView
|
|
20
|
+
| Blob
|
|
21
|
+
| Record<string, unknown>;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Decode inbound WebSocket payloads into UTF-8 text.
|
|
25
|
+
*
|
|
26
|
+
* Node/WebSocket clients may deliver command frames as Uint8Array/ArrayBuffer
|
|
27
|
+
* or Blob instead of plain strings.
|
|
28
|
+
*/
|
|
29
|
+
async function decodeWebSocketMessage(rawMessage: WebSocketRawMessage): Promise<string> {
|
|
30
|
+
if (typeof rawMessage === 'string') {
|
|
31
|
+
return rawMessage;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (typeof rawMessage === 'object' && rawMessage !== null && !ArrayBuffer.isView(rawMessage)) {
|
|
35
|
+
if (rawMessage instanceof ArrayBuffer) {
|
|
36
|
+
return Buffer.from(rawMessage).toString('utf-8');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (rawMessage instanceof Blob) {
|
|
40
|
+
return await rawMessage.text();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Some runtimes already JSON-decode inbound websocket command payloads.
|
|
44
|
+
return JSON.stringify(rawMessage);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (ArrayBuffer.isView(rawMessage)) {
|
|
48
|
+
return Buffer.from(
|
|
49
|
+
rawMessage.buffer,
|
|
50
|
+
rawMessage.byteOffset,
|
|
51
|
+
rawMessage.byteLength,
|
|
52
|
+
).toString('utf-8');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return String(rawMessage);
|
|
56
|
+
}
|
|
57
|
+
|
|
15
58
|
export class WebSocketHandler {
|
|
16
59
|
constructor(private pubsub: PubSubManager) {}
|
|
17
60
|
|
|
@@ -19,12 +62,22 @@ export class WebSocketHandler {
|
|
|
19
62
|
* Handle incoming WebSocket command
|
|
20
63
|
* AC: @api-contract ac-26, ac-27, ac-28, ac-30
|
|
21
64
|
*/
|
|
22
|
-
handleMessage(
|
|
65
|
+
handleMessage(
|
|
66
|
+
ws: ServerWebSocket<ConnectionData>,
|
|
67
|
+
rawMessage: WebSocketRawMessage,
|
|
68
|
+
): Promise<void> {
|
|
69
|
+
return this.handleMessageInternal(ws, rawMessage);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private async handleMessageInternal(
|
|
73
|
+
ws: ServerWebSocket<ConnectionData>,
|
|
74
|
+
rawMessage: WebSocketRawMessage,
|
|
75
|
+
): Promise<void> {
|
|
23
76
|
let command: WebSocketCommand;
|
|
24
77
|
|
|
25
78
|
try {
|
|
26
79
|
// Parse command
|
|
27
|
-
const messageStr =
|
|
80
|
+
const messageStr = await decodeWebSocketMessage(rawMessage);
|
|
28
81
|
command = JSON.parse(messageStr);
|
|
29
82
|
|
|
30
83
|
// Validate command structure
|
|
@@ -76,11 +129,12 @@ export class WebSocketHandler {
|
|
|
76
129
|
return;
|
|
77
130
|
}
|
|
78
131
|
|
|
79
|
-
const
|
|
132
|
+
const sessionId = this.resolveSessionId(ws);
|
|
133
|
+
const success = sessionId ? this.pubsub.subscribe(sessionId, topics) : false;
|
|
80
134
|
|
|
81
135
|
if (success) {
|
|
82
136
|
this.sendAck(ws, command.request_id, true);
|
|
83
|
-
console.log(`[ws] ${
|
|
137
|
+
console.log(`[ws] ${sessionId} subscribed to: ${topics.join(', ')}`);
|
|
84
138
|
} else {
|
|
85
139
|
this.sendAck(ws, command.request_id, false, 'not_found', 'Session not found');
|
|
86
140
|
}
|
|
@@ -97,11 +151,12 @@ export class WebSocketHandler {
|
|
|
97
151
|
return;
|
|
98
152
|
}
|
|
99
153
|
|
|
100
|
-
const
|
|
154
|
+
const sessionId = this.resolveSessionId(ws);
|
|
155
|
+
const success = sessionId ? this.pubsub.unsubscribe(sessionId, topics) : false;
|
|
101
156
|
|
|
102
157
|
if (success) {
|
|
103
158
|
this.sendAck(ws, command.request_id, true);
|
|
104
|
-
console.log(`[ws] ${
|
|
159
|
+
console.log(`[ws] ${sessionId} unsubscribed from: ${topics.join(', ')}`);
|
|
105
160
|
} else {
|
|
106
161
|
this.sendAck(ws, command.request_id, false, 'not_found', 'Session not found');
|
|
107
162
|
}
|
|
@@ -114,6 +169,12 @@ export class WebSocketHandler {
|
|
|
114
169
|
this.sendAck(ws, command.request_id, true);
|
|
115
170
|
}
|
|
116
171
|
|
|
172
|
+
private resolveSessionId(ws: ServerWebSocket<ConnectionData>): string | undefined {
|
|
173
|
+
const data = ws.data as { id?: unknown } | undefined;
|
|
174
|
+
const contextId = typeof data?.id === 'string' ? data.id : undefined;
|
|
175
|
+
return this.pubsub.getSessionIdBySocket(ws, contextId);
|
|
176
|
+
}
|
|
177
|
+
|
|
117
178
|
/**
|
|
118
179
|
* Send ack response
|
|
119
180
|
* AC: @api-contract ac-27
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ServerWebSocket } from 'bun';
|
|
2
|
+
import type { ConnectionData } from './types';
|
|
3
|
+
import type { PubSubManager } from './pubsub';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Handle websocket close cleanup and logging with stable session identity.
|
|
7
|
+
*/
|
|
8
|
+
export function handleWebSocketClose(
|
|
9
|
+
pubsub: PubSubManager,
|
|
10
|
+
ws: ServerWebSocket<ConnectionData>,
|
|
11
|
+
code: number,
|
|
12
|
+
reason: string
|
|
13
|
+
): string {
|
|
14
|
+
const closeContext = ws.data as { id?: unknown } | undefined;
|
|
15
|
+
const contextId = typeof closeContext?.id === 'string' ? closeContext.id : undefined;
|
|
16
|
+
const sessionId = pubsub.removeConnectionBySocket(ws, contextId) ?? 'unknown';
|
|
17
|
+
console.log(`[daemon] WebSocket client disconnected: ${sessionId} (code: ${code}, reason: ${reason})`);
|
|
18
|
+
return sessionId;
|
|
19
|
+
}
|
|
@@ -14,22 +14,93 @@ import type { ServerWebSocket } from 'bun';
|
|
|
14
14
|
import { ulid } from 'ulidx';
|
|
15
15
|
import type { BroadcastEvent, ConnectionData } from './types';
|
|
16
16
|
|
|
17
|
+
const SESSION_TOPIC_PREFIX = '__kspec_session:';
|
|
18
|
+
|
|
19
|
+
function sessionTopic(sessionId: string): string {
|
|
20
|
+
return `${SESSION_TOPIC_PREFIX}${sessionId}`;
|
|
21
|
+
}
|
|
22
|
+
|
|
17
23
|
export class PubSubManager {
|
|
18
24
|
private connections = new Map<string, ServerWebSocket<ConnectionData>>();
|
|
25
|
+
private sessionIdsBySocket = new WeakMap<ServerWebSocket<ConnectionData>, string>();
|
|
26
|
+
private sessionIdsByContextId = new Map<string, string>();
|
|
27
|
+
private contextIdsBySessionId = new Map<string, string>();
|
|
19
28
|
|
|
20
29
|
/**
|
|
21
30
|
* Register a new WebSocket connection
|
|
22
31
|
* AC: @trait-websocket-protocol ac-1
|
|
23
32
|
*/
|
|
24
|
-
addConnection(sessionId: string, ws: ServerWebSocket<ConnectionData
|
|
33
|
+
addConnection(sessionId: string, ws: ServerWebSocket<ConnectionData>, contextId?: string) {
|
|
25
34
|
this.connections.set(sessionId, ws);
|
|
35
|
+
this.sessionIdsBySocket.set(ws, sessionId);
|
|
36
|
+
if (contextId) {
|
|
37
|
+
this.sessionIdsByContextId.set(contextId, sessionId);
|
|
38
|
+
this.contextIdsBySessionId.set(sessionId, contextId);
|
|
39
|
+
}
|
|
40
|
+
ws.subscribe?.(sessionTopic(sessionId));
|
|
26
41
|
}
|
|
27
42
|
|
|
28
43
|
/**
|
|
29
44
|
* Remove a WebSocket connection
|
|
30
45
|
*/
|
|
31
|
-
removeConnection(sessionId: string) {
|
|
32
|
-
this.connections.
|
|
46
|
+
removeConnection(sessionId: string): boolean {
|
|
47
|
+
const ws = this.connections.get(sessionId);
|
|
48
|
+
if (ws) {
|
|
49
|
+
ws.unsubscribe?.(sessionTopic(sessionId));
|
|
50
|
+
this.sessionIdsBySocket.delete(ws);
|
|
51
|
+
}
|
|
52
|
+
const contextId = this.contextIdsBySessionId.get(sessionId);
|
|
53
|
+
if (contextId) {
|
|
54
|
+
this.contextIdsBySessionId.delete(sessionId);
|
|
55
|
+
this.sessionIdsByContextId.delete(contextId);
|
|
56
|
+
}
|
|
57
|
+
return this.connections.delete(sessionId);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Resolve a stable session ID for a socket and remove that connection.
|
|
62
|
+
* This is resilient when ws.data.sessionId is missing in close callbacks.
|
|
63
|
+
*/
|
|
64
|
+
removeConnectionBySocket(ws: ServerWebSocket<ConnectionData>, contextId?: string): string | undefined {
|
|
65
|
+
const sessionId = this.getSessionIdBySocket(ws, contextId);
|
|
66
|
+
if (!sessionId) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
this.removeConnection(sessionId);
|
|
71
|
+
return sessionId;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Get stable session ID for socket from registration mapping.
|
|
76
|
+
*/
|
|
77
|
+
getSessionIdBySocket(ws: ServerWebSocket<ConnectionData>, contextId?: string): string | undefined {
|
|
78
|
+
const mappedSessionId = this.sessionIdsBySocket.get(ws);
|
|
79
|
+
if (mappedSessionId) {
|
|
80
|
+
return mappedSessionId;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const data = ws.data as Partial<ConnectionData> | undefined;
|
|
84
|
+
if (data?.sessionId) {
|
|
85
|
+
return data.sessionId;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const subscriptions = (ws as Partial<ServerWebSocket<ConnectionData>>).subscriptions;
|
|
89
|
+
if (Array.isArray(subscriptions)) {
|
|
90
|
+
const sessionSubscription = subscriptions.find((topic) => topic.startsWith(SESSION_TOPIC_PREFIX));
|
|
91
|
+
if (sessionSubscription) {
|
|
92
|
+
return sessionSubscription.slice(SESSION_TOPIC_PREFIX.length);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (contextId) {
|
|
97
|
+
const sessionFromContext = this.sessionIdsByContextId.get(contextId);
|
|
98
|
+
if (sessionFromContext) {
|
|
99
|
+
return sessionFromContext;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return undefined;
|
|
33
104
|
}
|
|
34
105
|
|
|
35
106
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/export/html.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/export/html.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAqNlE"}
|
package/dist/export/html.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Generates self-contained HTML files with embedded JSON and SPA loader.
|
|
5
5
|
* AC: @gh-pages-export ac-6
|
|
6
6
|
*/
|
|
7
|
+
import { shortestUniqueUlid } from "../parser/refs.js";
|
|
7
8
|
/**
|
|
8
9
|
* Generate a self-contained HTML file with embedded JSON snapshot.
|
|
9
10
|
*
|
|
@@ -15,6 +16,8 @@
|
|
|
15
16
|
* AC: @gh-pages-export ac-6
|
|
16
17
|
*/
|
|
17
18
|
export function generateHtmlExport(snapshot) {
|
|
19
|
+
const taskUlids = snapshot.tasks.map((task) => task._ulid);
|
|
20
|
+
const itemUlids = snapshot.items.map((item) => item._ulid);
|
|
18
21
|
const jsonData = JSON.stringify(snapshot, null, 2);
|
|
19
22
|
const escapedJson = jsonData
|
|
20
23
|
.replace(/</g, "\\u003c")
|
|
@@ -183,7 +186,7 @@ export function generateHtmlExport(snapshot) {
|
|
|
183
186
|
${escapeHtml(task.title)}
|
|
184
187
|
</div>
|
|
185
188
|
<div class="item-meta">
|
|
186
|
-
@${task.slugs[0] || task._ulid
|
|
189
|
+
@${task.slugs[0] || shortestUniqueUlid(task._ulid, taskUlids)}
|
|
187
190
|
${task.spec_ref_title ? ` • ${escapeHtml(task.spec_ref_title)}` : ""}
|
|
188
191
|
</div>
|
|
189
192
|
</div>
|
|
@@ -199,7 +202,7 @@ export function generateHtmlExport(snapshot) {
|
|
|
199
202
|
<div class="item">
|
|
200
203
|
<div class="item-title">${escapeHtml(item.title)}</div>
|
|
201
204
|
<div class="item-meta">
|
|
202
|
-
${item.type || "item"} • @${item.slugs[0] || item._ulid
|
|
205
|
+
${item.type || "item"} • @${item.slugs[0] || shortestUniqueUlid(item._ulid, itemUlids)}
|
|
203
206
|
${item.acceptance_criteria?.length ? ` • ${item.acceptance_criteria.length} ACs` : ""}
|
|
204
207
|
</div>
|
|
205
208
|
</div>
|
package/dist/export/html.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/export/html.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/export/html.ts"],"names":[],"mappings":"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"}
|
package/dist/export/triage.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ export declare function truncateText(text: string, maxLen?: number): string;
|
|
|
16
16
|
* AC: @triage-agent-export ac-1
|
|
17
17
|
* AC: @triage-agent-export ac-3
|
|
18
18
|
*/
|
|
19
|
-
export declare function formatTriageRecordContext(record: TriageRecord): string;
|
|
19
|
+
export declare function formatTriageRecordContext(record: TriageRecord, displayRef?: string): string;
|
|
20
20
|
/**
|
|
21
21
|
* Export triage records in context (markdown) format.
|
|
22
22
|
* AC: @triage-agent-export ac-1 — markdown block per record
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../src/export/triage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../src/export/triage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAItE;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,YAAY,EACpB,UAAU,GAAE,MAAiC,GAC5C,MAAM,CAsBR;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAarE;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAExE;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,kBAAkB,CAYpB"}
|
package/dist/export/triage.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* AC: @triage-agent-export ac-1, ac-2, ac-3, ac-4
|
|
8
8
|
*/
|
|
9
|
+
import { shortestUniqueUlid } from "../parser/refs.js";
|
|
9
10
|
/**
|
|
10
11
|
* Truncate text to a maximum length, taking only the first line.
|
|
11
12
|
*/
|
|
@@ -20,9 +21,9 @@ export function truncateText(text, maxLen = 60) {
|
|
|
20
21
|
* AC: @triage-agent-export ac-1
|
|
21
22
|
* AC: @triage-agent-export ac-3
|
|
22
23
|
*/
|
|
23
|
-
export function formatTriageRecordContext(record) {
|
|
24
|
+
export function formatTriageRecordContext(record, displayRef = record._ulid.slice(0, 8)) {
|
|
24
25
|
const lines = [];
|
|
25
|
-
lines.push(`### ${
|
|
26
|
+
lines.push(`### ${displayRef} — ${truncateText(record.item_snapshot, 80)}`);
|
|
26
27
|
lines.push("");
|
|
27
28
|
lines.push(`**Item:** ${record.item_snapshot}`);
|
|
28
29
|
lines.push(`**Status:** ${record.status}`);
|
|
@@ -57,9 +58,10 @@ export function exportTriageAsContext(records) {
|
|
|
57
58
|
if (records.length === 0) {
|
|
58
59
|
return "No triage decisions recorded.";
|
|
59
60
|
}
|
|
61
|
+
const recordUlids = records.map((record) => record._ulid);
|
|
60
62
|
let content = "# Triage Decisions\n\n";
|
|
61
63
|
for (const record of records) {
|
|
62
|
-
content += formatTriageRecordContext(record);
|
|
64
|
+
content += formatTriageRecordContext(record, shortestUniqueUlid(record._ulid, recordUlids));
|
|
63
65
|
}
|
|
64
66
|
return content;
|
|
65
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/export/triage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/export/triage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alignment.d.ts","sourceRoot":"","sources":["../../src/parser/alignment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAO1E;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,oBAAoB,CAAC;IACpC,cAAc,EAAE,oBAAoB,CAAC;IACrC,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,GAAG,iBAAiB,GAAG,sBAAsB,CAAC;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;GAGG;AACH,qBAAa,cAAc;IACzB,+CAA+C;IAC/C,OAAO,CAAC,WAAW,CAA+B;IAElD,0CAA0C;IAC1C,OAAO,CAAC,UAAU,CAA6B;IAE/C,6BAA6B;IAC7B,OAAO,CAAC,SAAS,CAAqC;IAEtD,wBAAwB;IACxB,OAAO,CAAC,KAAK,CAAiC;IAE9C;;OAEG;gBACS,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE;IAkBxD;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAa1C;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE;IAO/C;;OAEG;IACH,cAAc,CACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,cAAc,GACvB,cAAc,GAAG,SAAS;IAW7B;;OAEG;IACH,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB;
|
|
1
|
+
{"version":3,"file":"alignment.d.ts","sourceRoot":"","sources":["../../src/parser/alignment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAO1E;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,oBAAoB,CAAC;IACpC,cAAc,EAAE,oBAAoB,CAAC;IACrC,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,GAAG,iBAAiB,GAAG,sBAAsB,CAAC;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;GAGG;AACH,qBAAa,cAAc;IACzB,+CAA+C;IAC/C,OAAO,CAAC,WAAW,CAA+B;IAElD,0CAA0C;IAC1C,OAAO,CAAC,UAAU,CAA6B;IAE/C,6BAA6B;IAC7B,OAAO,CAAC,SAAS,CAAqC;IAEtD,wBAAwB;IACxB,OAAO,CAAC,KAAK,CAAiC;IAE9C;;OAEG;gBACS,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE;IAkBxD;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAa1C;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE;IAO/C;;OAEG;IACH,cAAc,CACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,cAAc,GACvB,cAAc,GAAG,SAAS;IAW7B;;OAEG;IACH,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB;IAiC/D;;OAEG;IACH,wBAAwB,CACtB,QAAQ,EAAE,MAAM,GACf,yBAAyB,GAAG,SAAS;IA4BxC;;OAEG;IACH,qBAAqB,IAAI,gBAAgB,EAAE;IAsD3C;;OAEG;IACH,6BAA6B,IAAI,yBAAyB,EAAE;IAW5D;;OAEG;IACH,QAAQ,IAAI;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;KACvB;CAyBF;AAMD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,oBAAoB,CAAC;IACrC,SAAS,EAAE,oBAAoB,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAChD,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,UAAU,EAAE,EACtB,QAAQ,EAAE,cAAc,EAAE,EAC1B,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA6C5B"}
|
package/dist/parser/alignment.js
CHANGED
|
@@ -92,13 +92,15 @@ export class AlignmentIndex {
|
|
|
92
92
|
return "not_started";
|
|
93
93
|
}
|
|
94
94
|
// Check task statuses
|
|
95
|
-
const
|
|
95
|
+
const hasActiveWork = tasks.some((t) => t.status === "in_progress" ||
|
|
96
|
+
t.status === "pending_review" ||
|
|
97
|
+
t.status === "needs_work");
|
|
96
98
|
const allCompleted = tasks.every((t) => t.status === "completed");
|
|
97
99
|
const someCompleted = tasks.some((t) => t.status === "completed");
|
|
98
100
|
if (allCompleted) {
|
|
99
101
|
return "implemented";
|
|
100
102
|
}
|
|
101
|
-
if (
|
|
103
|
+
if (hasActiveWork || someCompleted) {
|
|
102
104
|
return "in_progress";
|
|
103
105
|
}
|
|
104
106
|
return "not_started";
|
|
@@ -144,9 +146,11 @@ export class AlignmentIndex {
|
|
|
144
146
|
// Orphaned spec (no tasks)
|
|
145
147
|
// AC: @trait-retrospective ac-1
|
|
146
148
|
// Skip retrospective specs from orphaned warnings
|
|
149
|
+
// Policy: warn for not_started and in_progress (suspicious), but trust
|
|
150
|
+
// implemented/verified as baseline history predating the task system.
|
|
147
151
|
const isRetrospective = spec.traits?.includes("@trait-retrospective");
|
|
148
152
|
if (taskUlids.length === 0 &&
|
|
149
|
-
currentStatus === "not_started" &&
|
|
153
|
+
(currentStatus === "not_started" || currentStatus === "in_progress") &&
|
|
150
154
|
!isRetrospective) {
|
|
151
155
|
warnings.push({
|
|
152
156
|
type: "orphaned_spec",
|
|
@@ -155,8 +159,9 @@ export class AlignmentIndex {
|
|
|
155
159
|
message: `Spec item "${spec.title}" has no implementing tasks`,
|
|
156
160
|
});
|
|
157
161
|
}
|
|
158
|
-
// Status mismatch
|
|
159
|
-
|
|
162
|
+
// Status mismatch (only when tasks exist — no-task specs are handled above
|
|
163
|
+
// for not_started/in_progress; implemented/verified are trusted as baseline)
|
|
164
|
+
if (taskUlids.length > 0 && currentStatus !== expectedStatus) {
|
|
160
165
|
warnings.push({
|
|
161
166
|
type: "status_mismatch",
|
|
162
167
|
specUlid,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alignment.js","sourceRoot":"","sources":["../../src/parser/alignment.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"alignment.js","sourceRoot":"","sources":["../../src/parser/alignment.ts"],"names":[],"mappings":"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"}
|