@kynetic-ai/spec 0.9.1 → 0.10.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 +261 -0
- package/dist/agent-runtime/dispatch.d.ts.map +1 -0
- package/dist/agent-runtime/dispatch.js +791 -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 +159 -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 +272 -0
- package/dist/daemon/server.ts +55 -20
- 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 +6 -3
- 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 +442 -119
- package/dist/schema/meta.d.ts.map +1 -1
- package/dist/schema/meta.js +55 -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 +112 -0
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +414 -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.BxCxvrZR.css +1 -0
- package/dist/web-ui/_app/immutable/assets/select-trigger.CV-KWLNP.css +1 -0
- package/dist/web-ui/_app/immutable/chunks/B-CZR0q8.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/B1IR5Su5.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BCkp8Hs8.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/B_Cvvtc4.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BtFaGGII.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/Bu8JVsCH.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/C87u-CNA.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/CrFkBTYp.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/D1ArdqNb.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/D28BF5MJ.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/D6RtLpzL.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/D7FHSgx2.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DBXrsxZQ.js +2 -0
- package/dist/web-ui/_app/immutable/chunks/Da_hHMuA.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/Do6LchSF.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DoNPtcAw.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DtUbXRZz.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DyFPRlLl.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DzAP8lRM.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DzVXElzN.js +2 -0
- package/dist/web-ui/_app/immutable/chunks/aoPBFken.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/i-XnOIX0.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/laxtrUO3.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/q1nIWgqB.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/sTLbk5Nm.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/vwKgQu5P.js +5 -0
- package/dist/web-ui/_app/immutable/entry/app.BCwMcqnT.js +2 -0
- package/dist/web-ui/_app/immutable/entry/start.wKCQH-tt.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/0.CjGVMG74.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/1.B6_AIPan.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/2.q4oCS7Ws.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/3.rTKZf9o2.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/4.DVIDRu1d.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/5.8PtPXIOd.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/6.ZZrTemy_.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/7.IP-gxCxi.js +1 -0
- package/dist/web-ui/_app/version.json +1 -0
- package/dist/web-ui/index.html +36 -0
- package/dist/web-ui/robots.txt +3 -0
- package/package.json +3 -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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kynetic-ai/spec",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Kynetic Spec - Structured specification format for human-AI collaboration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"workspaces": [
|
|
@@ -22,9 +22,10 @@
|
|
|
22
22
|
"author": "Kynetic AI",
|
|
23
23
|
"scripts": {
|
|
24
24
|
"bootstrap": "node scripts/bootstrap.cjs",
|
|
25
|
-
"build": "tsc && chmod +x dist/cli/index.js && npm run build:daemon && npm run build:plugin",
|
|
25
|
+
"build": "tsc && chmod +x dist/cli/index.js && npm run build:daemon && npm run build:web-ui && npm run build:plugin",
|
|
26
26
|
"build:plugin": "node scripts/build-plugin.cjs",
|
|
27
27
|
"build:daemon": "shx rm -rf dist/daemon && shx mkdir -p dist/daemon && shx cp -r packages/daemon/src/* dist/daemon/",
|
|
28
|
+
"build:web-ui": "shx rm -rf dist/web-ui && cd packages/web-ui && npm run build && shx cp -r build ../../dist/web-ui",
|
|
28
29
|
"dev": "tsx src/cli/index.ts",
|
|
29
30
|
"setup:dev": "npm install && npm run build && npm link",
|
|
30
31
|
"prepack": "npm run build:plugin",
|
|
@@ -61,6 +61,7 @@ Use CLI commands to find information. **Do NOT search `.kspec/` YAML files manua
|
|
|
61
61
|
| List by type | `kspec item list --type feature` |
|
|
62
62
|
| All traits | `kspec trait list` |
|
|
63
63
|
| Task's linked spec | `kspec task get @ref` → read `spec_ref` field |
|
|
64
|
+
| Task's linked plan | `kspec task get @ref` → if `plan_ref` is non-null, run `kspec plan get @plan-ref` |
|
|
64
65
|
|
|
65
66
|
**Key pattern:** When `kspec item get` output shows "Inherited from @trait-slug", run `kspec item get @trait-slug` to see the trait's ACs. One command — do not grep YAML files.
|
|
66
67
|
|
|
@@ -93,9 +94,30 @@ If already implemented: verify tests pass, AC coverage exists, then `kspec task
|
|
|
93
94
|
### 3. Start Task
|
|
94
95
|
|
|
95
96
|
```bash
|
|
97
|
+
# Check task links first
|
|
98
|
+
kspec task get @ref
|
|
99
|
+
|
|
100
|
+
# If plan_ref is non-null, load implementation context from the plan
|
|
101
|
+
kspec plan get @plan-ref
|
|
102
|
+
|
|
103
|
+
# Then start work
|
|
96
104
|
kspec task start @ref
|
|
97
105
|
```
|
|
98
106
|
|
|
107
|
+
### 3.5 Branch Isolation (Required Before Edits)
|
|
108
|
+
|
|
109
|
+
Immediately after `kspec task start` and before any file edits, create or switch to a dedicated branch for that task. Do not keep implementing on a branch that is tied to another pending-review task.
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# Example naming from task intent/slug
|
|
113
|
+
TASK_BRANCH="fix/<task-slug>"
|
|
114
|
+
|
|
115
|
+
# Create the branch if missing, otherwise switch to it
|
|
116
|
+
git checkout -b "$TASK_BRANCH" 2>/dev/null || git checkout "$TASK_BRANCH"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
This keeps each task's commits scoped to its own PR and prevents cross-task contamination.
|
|
120
|
+
|
|
99
121
|
### 4. Work and Note
|
|
100
122
|
|
|
101
123
|
Read all ACs (own + trait) before implementing:
|
|
@@ -266,6 +288,7 @@ kspec tasks ready --eligible # Only automation-eligible tasks
|
|
|
266
288
|
### Key Behaviors
|
|
267
289
|
|
|
268
290
|
- Verify work is needed before starting (prevent duplicates)
|
|
291
|
+
- Create/switch to a dedicated task branch before making code edits
|
|
269
292
|
- Decisions auto-resolve without prompts
|
|
270
293
|
- PR review handled externally (not this workflow)
|
|
271
294
|
- All actions are logged and auditable
|
|
@@ -288,12 +311,12 @@ After blocking:
|
|
|
288
311
|
kspec task block @ref --reason "Reason..."
|
|
289
312
|
kspec tasks ready --eligible # Check for other work
|
|
290
313
|
# If tasks exist: work on the next one
|
|
291
|
-
# If empty: stop responding (
|
|
314
|
+
# If empty: stop responding (agent dispatch exits automatically)
|
|
292
315
|
```
|
|
293
316
|
|
|
294
317
|
### Turn Completion
|
|
295
318
|
|
|
296
|
-
After creating a PR, **stop responding**.
|
|
319
|
+
After creating a PR, **stop responding**. The agent dispatch engine continues automatically — it checks for remaining eligible tasks and exits when none remain.
|
|
297
320
|
|
|
298
321
|
**Do NOT call `end-loop`** after creating a PR. That ends ALL remaining iterations. It's a rare escape hatch for when work is stalling across multiple iterations.
|
|
299
322
|
|
|
@@ -1,24 +1,77 @@
|
|
|
1
|
-
##
|
|
1
|
+
## Agent Dispatch Mode
|
|
2
2
|
|
|
3
|
-
When running
|
|
3
|
+
When running as an automated agent via the dispatch engine:
|
|
4
4
|
|
|
5
|
-
###
|
|
5
|
+
### Dispatch Engine Commands
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Start background dispatch (daemon must be running)
|
|
9
|
+
kspec agent dispatch start
|
|
10
|
+
|
|
11
|
+
# Inspect active/queued work and loaded agents
|
|
12
|
+
kspec agent dispatch status
|
|
13
|
+
|
|
14
|
+
# Stream live text output from running invocations
|
|
15
|
+
kspec agent dispatch watch
|
|
16
|
+
|
|
17
|
+
# Stop dispatch gracefully
|
|
18
|
+
kspec agent dispatch stop
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Built-In Agents
|
|
22
|
+
|
|
23
|
+
`kspec setup` ensures default worker/reviewer agent definitions exist in `kynetic.meta.yaml`:
|
|
24
|
+
|
|
25
|
+
- `task-worker` — handles automation-eligible `task.ready`, `task.in_progress`, and `task.needs_work`
|
|
26
|
+
- `pr-reviewer` — handles `task.pending_review`
|
|
27
|
+
|
|
28
|
+
Inspect current definitions with:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
kspec agent list
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Dispatch Rules and Trigger Events
|
|
35
|
+
|
|
36
|
+
| Trigger event | Typical handler | Notes |
|
|
37
|
+
|---------------|-----------------|-------|
|
|
38
|
+
| `task.ready` | `task-worker` | Worker picks up newly ready automation-eligible tasks |
|
|
39
|
+
| `task.in_progress` | `task-worker` | Worker can continue existing automation-eligible tasks |
|
|
40
|
+
| `task.needs_work` | `task-worker` | Fix-cycle tasks return to worker |
|
|
41
|
+
| `task.pending_review` | `pr-reviewer` | Review/merge workflow runs in separate invocation |
|
|
42
|
+
|
|
43
|
+
### One-Shot Invocation
|
|
44
|
+
|
|
45
|
+
Run a single agent directly (outside dispatch):
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
kspec agent run <agent-id> [prompt]
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Common flags:
|
|
52
|
+
|
|
53
|
+
- `--task @task-ref` to target a specific task
|
|
54
|
+
- `--dry-run` to preview prompt without spawning
|
|
55
|
+
- `--json` for structured output
|
|
56
|
+
- `--timeout <minutes>` and `--budget <n>` for execution limits
|
|
57
|
+
|
|
58
|
+
### Dispatch Loop Behavior
|
|
6
59
|
|
|
7
60
|
```
|
|
8
|
-
for each
|
|
9
|
-
1.
|
|
61
|
+
for each dispatched invocation:
|
|
62
|
+
1. Agent runtime checks eligible tasks — if none, invocation ends
|
|
10
63
|
2. Agent works on tasks, may create PR(s)
|
|
64
|
+
- Before editing files on a selected task, create/switch to a dedicated task branch
|
|
11
65
|
3. Agent stops responding (turn complete)
|
|
12
|
-
4.
|
|
13
|
-
5.
|
|
14
|
-
6. Continue
|
|
66
|
+
4. pr-reviewer agent handles pending_review tasks via separate dispatch
|
|
67
|
+
5. Continue
|
|
15
68
|
```
|
|
16
69
|
|
|
17
|
-
**When you stop responding,
|
|
70
|
+
**When you stop responding, the dispatch engine continues automatically.** Do NOT call `kspec agent end-loop` after creating a PR.
|
|
18
71
|
|
|
19
72
|
### Task Inheritance
|
|
20
73
|
|
|
21
|
-
Priority: `needs_work` > `in_progress` > `pending`. Always inherit existing work before starting new tasks. (`pending_review` tasks are handled by the
|
|
74
|
+
Priority: `needs_work` > `in_progress` > `pending`. Always inherit existing work before starting new tasks. (`pending_review` tasks are handled by the pr-reviewer agent, not the worker.)
|
|
22
75
|
|
|
23
76
|
### Blocking Rules
|
|
24
77
|
|
|
@@ -39,7 +92,7 @@ Priority: `needs_work` > `in_progress` > `pending`. Always inherit existing work
|
|
|
39
92
|
kspec task block @task --reason "Reason..."
|
|
40
93
|
kspec tasks ready --eligible
|
|
41
94
|
# If tasks returned: work on next one
|
|
42
|
-
# If empty: stop responding —
|
|
95
|
+
# If empty: stop responding — dispatch engine auto-exits
|
|
43
96
|
```
|
|
44
97
|
|
|
45
98
|
**One blocked task is NOT "no more work."** `kspec tasks ready --eligible` output is authoritative.
|
|
@@ -54,6 +54,7 @@ Use CLI commands to find information. **Do NOT search `.kspec/` YAML files manua
|
|
|
54
54
|
| List by type | `kspec item list --type feature` |
|
|
55
55
|
| All traits | `kspec trait list` |
|
|
56
56
|
| Task's linked spec | `kspec task get @ref` → read `spec_ref` field |
|
|
57
|
+
| Task's linked plan | `kspec task get @ref` → if `plan_ref` is non-null, run `kspec plan get @plan-ref` |
|
|
57
58
|
|
|
58
59
|
**Key pattern:** When `kspec item get` output shows "Inherited from @trait-slug", run `kspec item get @trait-slug` to see the trait's ACs. One command — do not grep YAML files.
|
|
59
60
|
|
|
@@ -86,9 +87,30 @@ If already implemented: verify tests pass, AC coverage exists, then `kspec task
|
|
|
86
87
|
### 3. Start Task
|
|
87
88
|
|
|
88
89
|
```bash
|
|
90
|
+
# Check task links first
|
|
91
|
+
kspec task get @ref
|
|
92
|
+
|
|
93
|
+
# If plan_ref is non-null, load implementation context from the plan
|
|
94
|
+
kspec plan get @plan-ref
|
|
95
|
+
|
|
96
|
+
# Then start work
|
|
89
97
|
kspec task start @ref
|
|
90
98
|
```
|
|
91
99
|
|
|
100
|
+
### 3.5 Branch Isolation (Required Before Edits)
|
|
101
|
+
|
|
102
|
+
Immediately after `kspec task start` and before any file edits, create or switch to a dedicated branch for that task. Do not keep implementing on a branch that is tied to another pending-review task.
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# Example naming from task intent/slug
|
|
106
|
+
TASK_BRANCH="fix/<task-slug>"
|
|
107
|
+
|
|
108
|
+
# Create the branch if missing, otherwise switch to it
|
|
109
|
+
git checkout -b "$TASK_BRANCH" 2>/dev/null || git checkout "$TASK_BRANCH"
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
This keeps each task's commits scoped to its own PR and prevents cross-task contamination.
|
|
113
|
+
|
|
92
114
|
### 4. Work and Note
|
|
93
115
|
|
|
94
116
|
Read all ACs (own + trait) before implementing:
|
|
@@ -259,6 +281,7 @@ kspec tasks ready --eligible # Only automation-eligible tasks
|
|
|
259
281
|
### Key Behaviors
|
|
260
282
|
|
|
261
283
|
- Verify work is needed before starting (prevent duplicates)
|
|
284
|
+
- Create/switch to a dedicated task branch before making code edits
|
|
262
285
|
- Decisions auto-resolve without prompts
|
|
263
286
|
- PR review handled externally (not this workflow)
|
|
264
287
|
- All actions are logged and auditable
|
|
@@ -281,12 +304,12 @@ After blocking:
|
|
|
281
304
|
kspec task block @ref --reason "Reason..."
|
|
282
305
|
kspec tasks ready --eligible # Check for other work
|
|
283
306
|
# If tasks exist: work on the next one
|
|
284
|
-
# If empty: stop responding (
|
|
307
|
+
# If empty: stop responding (agent dispatch exits automatically)
|
|
285
308
|
```
|
|
286
309
|
|
|
287
310
|
### Turn Completion
|
|
288
311
|
|
|
289
|
-
After creating a PR, **stop responding**.
|
|
312
|
+
After creating a PR, **stop responding**. The agent dispatch engine continues automatically — it checks for remaining eligible tasks and exits when none remain.
|
|
290
313
|
|
|
291
314
|
**Do NOT call `end-loop`** after creating a PR. That ends ALL remaining iterations. It's a rare escape hatch for when work is stalling across multiple iterations.
|
|
292
315
|
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ralph CLI Renderer
|
|
3
|
-
*
|
|
4
|
-
* Renders RalphEvents to the terminal with chalk colors and formatting.
|
|
5
|
-
* This is the CLI-specific implementation; other renderers (TUI) could
|
|
6
|
-
* consume the same event stream with different display logic.
|
|
7
|
-
*/
|
|
8
|
-
import type { RalphEvent } from "./events.js";
|
|
9
|
-
export interface RalphRenderer {
|
|
10
|
-
/**
|
|
11
|
-
* Render an event to the output.
|
|
12
|
-
*/
|
|
13
|
-
render(event: RalphEvent): void;
|
|
14
|
-
/**
|
|
15
|
-
* Called when a new section starts (e.g., iteration boundary).
|
|
16
|
-
*/
|
|
17
|
-
newSection?(label: string): void;
|
|
18
|
-
}
|
|
19
|
-
export declare function createCliRenderer(): RalphRenderer;
|
|
20
|
-
/**
|
|
21
|
-
* Create a renderer that prefixes all output with a label.
|
|
22
|
-
* Used to distinguish subagent output from main agent output.
|
|
23
|
-
*
|
|
24
|
-
* AC: @ralph-subagent-spawning ac-11
|
|
25
|
-
*/
|
|
26
|
-
export declare function createPrefixedRenderer(prefix: string): RalphRenderer;
|
|
27
|
-
//# sourceMappingURL=cli-renderer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-renderer.d.ts","sourceRoot":"","sources":["../../src/ralph/cli-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAGV,UAAU,EAKX,MAAM,aAAa,CAAC;AAMrB,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAEhC;;OAEG;IACH,UAAU,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAgCD,wBAAgB,iBAAiB,IAAI,aAAa,CAgDjD;AA8JD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAqEpE"}
|
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ralph CLI Renderer
|
|
3
|
-
*
|
|
4
|
-
* Renders RalphEvents to the terminal with chalk colors and formatting.
|
|
5
|
-
* This is the CLI-specific implementation; other renderers (TUI) could
|
|
6
|
-
* consume the same event stream with different display logic.
|
|
7
|
-
*/
|
|
8
|
-
import chalk from "chalk";
|
|
9
|
-
// ============================================================================
|
|
10
|
-
// Timestamp Formatting
|
|
11
|
-
// ============================================================================
|
|
12
|
-
/**
|
|
13
|
-
* Format milliseconds as relative timestamp.
|
|
14
|
-
* Examples: +0s, +5s, +1m, +2m30s
|
|
15
|
-
*/
|
|
16
|
-
function formatTimestamp(ms) {
|
|
17
|
-
const seconds = Math.floor(ms / 1000);
|
|
18
|
-
if (seconds < 60) {
|
|
19
|
-
return `+${seconds}s`;
|
|
20
|
-
}
|
|
21
|
-
const minutes = Math.floor(seconds / 60);
|
|
22
|
-
const remainingSeconds = seconds % 60;
|
|
23
|
-
if (remainingSeconds === 0) {
|
|
24
|
-
return `+${minutes}m`;
|
|
25
|
-
}
|
|
26
|
-
return `+${minutes}m${remainingSeconds}s`;
|
|
27
|
-
}
|
|
28
|
-
export function createCliRenderer() {
|
|
29
|
-
const state = {
|
|
30
|
-
lastEventType: null,
|
|
31
|
-
isStreaming: false,
|
|
32
|
-
};
|
|
33
|
-
function render(event) {
|
|
34
|
-
const ts = chalk.gray(`[${formatTimestamp(event.timestamp)}]`);
|
|
35
|
-
const data = event.data;
|
|
36
|
-
switch (data.kind) {
|
|
37
|
-
case "agent_message":
|
|
38
|
-
renderAgentMessage(ts, data, state);
|
|
39
|
-
break;
|
|
40
|
-
case "agent_thought":
|
|
41
|
-
renderAgentThought(ts, data, state);
|
|
42
|
-
break;
|
|
43
|
-
case "tool_start":
|
|
44
|
-
renderToolStart(ts, data, state);
|
|
45
|
-
break;
|
|
46
|
-
case "tool_update":
|
|
47
|
-
renderToolUpdate(ts, data);
|
|
48
|
-
break;
|
|
49
|
-
case "tool_result":
|
|
50
|
-
renderToolResult(ts, data, state);
|
|
51
|
-
break;
|
|
52
|
-
case "status":
|
|
53
|
-
renderStatus(ts, data);
|
|
54
|
-
break;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
function newSection(label) {
|
|
58
|
-
// End any streaming state
|
|
59
|
-
if (state.isStreaming) {
|
|
60
|
-
process.stdout.write("\n");
|
|
61
|
-
state.isStreaming = false;
|
|
62
|
-
}
|
|
63
|
-
state.lastEventType = null;
|
|
64
|
-
console.log("");
|
|
65
|
-
console.log(chalk.cyan(`${"─".repeat(60)}`));
|
|
66
|
-
console.log(chalk.cyan.bold(label));
|
|
67
|
-
console.log(chalk.cyan(`${"─".repeat(60)}`));
|
|
68
|
-
console.log("");
|
|
69
|
-
}
|
|
70
|
-
return { render, newSection };
|
|
71
|
-
}
|
|
72
|
-
// ============================================================================
|
|
73
|
-
// Event Renderers
|
|
74
|
-
// ============================================================================
|
|
75
|
-
function renderAgentMessage(ts, data, state) {
|
|
76
|
-
// New section header if switching from non-message
|
|
77
|
-
if (state.lastEventType !== "agent_message" && !state.isStreaming) {
|
|
78
|
-
if (state.lastEventType !== null) {
|
|
79
|
-
console.log(""); // Spacing
|
|
80
|
-
}
|
|
81
|
-
console.log(`${ts} ${chalk.blue("--- Agent ---")}`);
|
|
82
|
-
}
|
|
83
|
-
// Stream content directly
|
|
84
|
-
if (data.isStreaming) {
|
|
85
|
-
process.stdout.write(data.content);
|
|
86
|
-
state.isStreaming = true;
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
// Final content - ensure newline
|
|
90
|
-
if (state.isStreaming) {
|
|
91
|
-
process.stdout.write("\n");
|
|
92
|
-
}
|
|
93
|
-
state.isStreaming = false;
|
|
94
|
-
}
|
|
95
|
-
state.lastEventType = "agent_message";
|
|
96
|
-
}
|
|
97
|
-
function renderAgentThought(ts, data, state) {
|
|
98
|
-
// New section header if switching from non-thought
|
|
99
|
-
if (state.lastEventType !== "agent_thought" && !state.isStreaming) {
|
|
100
|
-
if (state.lastEventType !== null) {
|
|
101
|
-
console.log("");
|
|
102
|
-
}
|
|
103
|
-
console.log(`${ts} ${chalk.magenta("--- Thinking ---")}`);
|
|
104
|
-
}
|
|
105
|
-
// Stream content in dim/gray
|
|
106
|
-
if (data.isStreaming) {
|
|
107
|
-
process.stdout.write(chalk.dim(data.content));
|
|
108
|
-
state.isStreaming = true;
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
if (state.isStreaming) {
|
|
112
|
-
process.stdout.write("\n");
|
|
113
|
-
}
|
|
114
|
-
state.isStreaming = false;
|
|
115
|
-
}
|
|
116
|
-
state.lastEventType = "agent_thought";
|
|
117
|
-
}
|
|
118
|
-
function renderToolStart(ts, data, state) {
|
|
119
|
-
// End any streaming
|
|
120
|
-
if (state.isStreaming) {
|
|
121
|
-
process.stdout.write("\n");
|
|
122
|
-
state.isStreaming = false;
|
|
123
|
-
}
|
|
124
|
-
if (state.lastEventType !== null) {
|
|
125
|
-
console.log("");
|
|
126
|
-
}
|
|
127
|
-
console.log(`${ts} ${chalk.yellow(`--- Tool: ${data.tool} ---`)}`);
|
|
128
|
-
// Show summary if available
|
|
129
|
-
if (data.summary) {
|
|
130
|
-
console.log(`${ts} ${chalk.gray(data.summary)}`);
|
|
131
|
-
}
|
|
132
|
-
state.lastEventType = "tool_start";
|
|
133
|
-
}
|
|
134
|
-
function renderToolUpdate(ts, data) {
|
|
135
|
-
// If summary is present, this is the phased input arrival - show the summary
|
|
136
|
-
if (data.summary) {
|
|
137
|
-
console.log(`${ts} ${chalk.gray(data.summary)}`);
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
// Otherwise show status update
|
|
141
|
-
const statusIcon = data.status === "running" ? chalk.blue("⟳") : chalk.gray("○");
|
|
142
|
-
console.log(`${ts} ${statusIcon} ${chalk.gray(data.status)}`);
|
|
143
|
-
}
|
|
144
|
-
function renderToolResult(ts, data, state) {
|
|
145
|
-
// Status line
|
|
146
|
-
const statusColor = data.status === "completed"
|
|
147
|
-
? chalk.green
|
|
148
|
-
: data.status === "failed"
|
|
149
|
-
? chalk.red
|
|
150
|
-
: chalk.yellow;
|
|
151
|
-
const statusIcon = data.status === "completed" ? "✓" : data.status === "failed" ? "✗" : "○";
|
|
152
|
-
console.log(`${ts} ${statusColor(`${statusIcon} ${data.status}`)}`);
|
|
153
|
-
// Output (if any)
|
|
154
|
-
if (data.output) {
|
|
155
|
-
const outputLines = data.output.split("\n");
|
|
156
|
-
const indent = " "; // Align with timestamp
|
|
157
|
-
// Show output with indentation
|
|
158
|
-
for (const line of outputLines.slice(0, 20)) {
|
|
159
|
-
console.log(chalk.gray(`${indent}${line}`));
|
|
160
|
-
}
|
|
161
|
-
if (data.truncated) {
|
|
162
|
-
console.log(chalk.gray(`${indent}... (truncated)`));
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
state.lastEventType = "tool_result";
|
|
166
|
-
}
|
|
167
|
-
function renderStatus(ts, data) {
|
|
168
|
-
const statusColor = data.status === "completed" || data.status === "end_turn"
|
|
169
|
-
? chalk.green
|
|
170
|
-
: data.status === "error" || data.status === "crashed"
|
|
171
|
-
? chalk.red
|
|
172
|
-
: chalk.gray;
|
|
173
|
-
let statusText = data.status;
|
|
174
|
-
if (data.message) {
|
|
175
|
-
statusText += `: ${data.message}`;
|
|
176
|
-
}
|
|
177
|
-
console.log(`${ts} ${statusColor(`[${statusText}]`)}`);
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Create a renderer that prefixes all output with a label.
|
|
181
|
-
* Used to distinguish subagent output from main agent output.
|
|
182
|
-
*
|
|
183
|
-
* AC: @ralph-subagent-spawning ac-11
|
|
184
|
-
*/
|
|
185
|
-
export function createPrefixedRenderer(prefix) {
|
|
186
|
-
const inner = createCliRenderer();
|
|
187
|
-
const prefixStr = chalk.cyan(`${prefix} `);
|
|
188
|
-
const state = {
|
|
189
|
-
atLineStart: true,
|
|
190
|
-
};
|
|
191
|
-
/**
|
|
192
|
-
* Execute a function with prefixed console.log and stdout.write.
|
|
193
|
-
* Ensures all output is prefixed consistently.
|
|
194
|
-
*/
|
|
195
|
-
function withPrefixedOutput(fn) {
|
|
196
|
-
const originalLog = console.log;
|
|
197
|
-
const originalWrite = process.stdout.write;
|
|
198
|
-
// Wrap console.log - prefix is handled by stdout.write wrapper below,
|
|
199
|
-
// so we just delegate to the original and mark line start.
|
|
200
|
-
console.log = (...args) => {
|
|
201
|
-
originalLog(...args);
|
|
202
|
-
state.atLineStart = true;
|
|
203
|
-
};
|
|
204
|
-
// Wrap process.stdout.write for streaming content
|
|
205
|
-
// Track line boundaries to only prefix at start of lines
|
|
206
|
-
// biome-ignore lint/suspicious/noExplicitAny: stdout.write has complex overloads
|
|
207
|
-
process.stdout.write = (chunk, ...args) => {
|
|
208
|
-
if (typeof chunk === "string") {
|
|
209
|
-
// Split by newlines but preserve them
|
|
210
|
-
const parts = chunk.split(/(\n)/);
|
|
211
|
-
let output = "";
|
|
212
|
-
for (const part of parts) {
|
|
213
|
-
if (part === "\n") {
|
|
214
|
-
output += part;
|
|
215
|
-
state.atLineStart = true;
|
|
216
|
-
}
|
|
217
|
-
else if (part.length > 0) {
|
|
218
|
-
if (state.atLineStart) {
|
|
219
|
-
output += prefixStr + part;
|
|
220
|
-
state.atLineStart = false;
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
223
|
-
output += part;
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
return originalWrite.call(process.stdout, output, ...args);
|
|
228
|
-
}
|
|
229
|
-
// For Uint8Array, pass through unchanged
|
|
230
|
-
return originalWrite.call(process.stdout, chunk, ...args);
|
|
231
|
-
};
|
|
232
|
-
try {
|
|
233
|
-
return fn();
|
|
234
|
-
}
|
|
235
|
-
finally {
|
|
236
|
-
console.log = originalLog;
|
|
237
|
-
process.stdout.write = originalWrite;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
return {
|
|
241
|
-
render(event) {
|
|
242
|
-
withPrefixedOutput(() => inner.render(event));
|
|
243
|
-
},
|
|
244
|
-
newSection(label) {
|
|
245
|
-
state.atLineStart = true;
|
|
246
|
-
withPrefixedOutput(() => inner.newSection?.(label));
|
|
247
|
-
},
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
//# sourceMappingURL=cli-renderer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-renderer.js","sourceRoot":"","sources":["../../src/ralph/cli-renderer.ts"],"names":[],"mappings":"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"}
|
package/dist/ralph/events.d.ts
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ralph Event System
|
|
3
|
-
*
|
|
4
|
-
* Translates ACP SessionUpdate events into structured RalphEvents.
|
|
5
|
-
* This layer is pure data - no rendering concerns. Enables future
|
|
6
|
-
* TUI or other renderers to consume the same event stream.
|
|
7
|
-
*/
|
|
8
|
-
import type { SessionUpdate } from "../acp/types.js";
|
|
9
|
-
export type RalphEventType = "agent_message" | "agent_thought" | "tool_start" | "tool_update" | "tool_result" | "status";
|
|
10
|
-
export interface RalphEvent {
|
|
11
|
-
type: RalphEventType;
|
|
12
|
-
timestamp: number;
|
|
13
|
-
data: RalphEventData;
|
|
14
|
-
}
|
|
15
|
-
export type RalphEventData = AgentMessageData | AgentThoughtData | ToolStartData | ToolUpdateData | ToolResultData | StatusData;
|
|
16
|
-
export interface AgentMessageData {
|
|
17
|
-
kind: "agent_message";
|
|
18
|
-
content: string;
|
|
19
|
-
isStreaming: boolean;
|
|
20
|
-
}
|
|
21
|
-
export interface AgentThoughtData {
|
|
22
|
-
kind: "agent_thought";
|
|
23
|
-
content: string;
|
|
24
|
-
isStreaming: boolean;
|
|
25
|
-
}
|
|
26
|
-
export interface ToolStartData {
|
|
27
|
-
kind: "tool_start";
|
|
28
|
-
toolCallId: string;
|
|
29
|
-
tool: string;
|
|
30
|
-
summary: string;
|
|
31
|
-
input: unknown;
|
|
32
|
-
}
|
|
33
|
-
export interface ToolUpdateData {
|
|
34
|
-
kind: "tool_update";
|
|
35
|
-
toolCallId: string;
|
|
36
|
-
tool: string;
|
|
37
|
-
status: "pending" | "running";
|
|
38
|
-
summary?: string;
|
|
39
|
-
}
|
|
40
|
-
export interface ToolResultData {
|
|
41
|
-
kind: "tool_result";
|
|
42
|
-
toolCallId: string;
|
|
43
|
-
tool: string;
|
|
44
|
-
status: "completed" | "failed" | "cancelled";
|
|
45
|
-
output?: string;
|
|
46
|
-
truncated: boolean;
|
|
47
|
-
}
|
|
48
|
-
export interface StatusData {
|
|
49
|
-
kind: "status";
|
|
50
|
-
status: string;
|
|
51
|
-
message?: string;
|
|
52
|
-
}
|
|
53
|
-
export interface RalphTranslator {
|
|
54
|
-
/**
|
|
55
|
-
* Translate an ACP SessionUpdate to a RalphEvent.
|
|
56
|
-
* Returns null if the update should be suppressed.
|
|
57
|
-
*/
|
|
58
|
-
translate(update: SessionUpdate): RalphEvent | null;
|
|
59
|
-
/**
|
|
60
|
-
* Signal end of stream. Returns final event if there's pending state.
|
|
61
|
-
*/
|
|
62
|
-
finalize(): RalphEvent | null;
|
|
63
|
-
}
|
|
64
|
-
export declare function createTranslator(): RalphTranslator;
|
|
65
|
-
//# sourceMappingURL=events.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/ralph/events.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMrD,MAAM,MAAM,cAAc,GACtB,eAAe,GACf,eAAe,GACf,YAAY,GACZ,aAAa,GACb,aAAa,GACb,QAAQ,CAAC;AAEb,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,cAAc,CAAC;CACtB;AAED,MAAM,MAAM,cAAc,GACtB,gBAAgB,GAChB,gBAAgB,GAChB,aAAa,GACb,cAAc,GACd,cAAc,GACd,UAAU,CAAC;AAEf,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,GAAG,IAAI,CAAC;IAEpD;;OAEG;IACH,QAAQ,IAAI,UAAU,GAAG,IAAI,CAAC;CAC/B;AA2VD,wBAAgB,gBAAgB,IAAI,eAAe,CAqWlD"}
|