@sayknow-cli/coding-agent 0.3.7 → 0.3.9
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/dist/types/append-only-mode.d.ts +31 -0
- package/dist/types/capability/rule.d.ts +8 -0
- package/dist/types/cli/completion-cli.d.ts +41 -0
- package/dist/types/cli/config-cli.d.ts +1 -0
- package/dist/types/cli/fixture-report.d.ts +20 -0
- package/dist/types/cli/fixture-report.test.d.ts +1 -0
- package/dist/types/cli/nofile-limit.d.ts +11 -0
- package/dist/types/cli/notify-cli.d.ts +7 -0
- package/dist/types/cli/update-cli.d.ts +22 -0
- package/dist/types/cli.d.ts +124 -1
- package/dist/types/commands/completion.d.ts +29 -0
- package/dist/types/commands/config.d.ts +3 -0
- package/dist/types/commands/deep-interview.d.ts +3 -0
- package/dist/types/config/file-lock.d.ts +7 -6
- package/dist/types/config/keybindings.d.ts +2 -2
- package/dist/types/config/model-profile-activation.d.ts +6 -0
- package/dist/types/config/model-profiles.d.ts +1 -0
- package/dist/types/config/settings-schema.d.ts +119 -1
- package/dist/types/config/settings.d.ts +8 -0
- package/dist/types/discovery/index.d.ts +1 -0
- package/dist/types/export/html/template.generated.d.ts +1 -1
- package/dist/types/export/ttsr.d.ts +14 -3
- package/dist/types/extensibility/extensions/runner.d.ts +2 -1
- package/dist/types/extensibility/extensions/types.d.ts +8 -0
- package/dist/types/goals/runtime.d.ts +1 -0
- package/dist/types/hooks/native-skill-hook.d.ts +12 -0
- package/dist/types/main.d.ts +4 -1
- package/dist/types/modes/components/assistant-message.d.ts +5 -1
- package/dist/types/modes/components/model-selector.d.ts +4 -0
- package/dist/types/modes/components/queued-message-selector.d.ts +12 -0
- package/dist/types/modes/components/settings-selector.d.ts +2 -0
- package/dist/types/modes/components/status-line.d.ts +9 -0
- package/dist/types/modes/components/thinking-selector.d.ts +2 -2
- package/dist/types/modes/controllers/command-controller.d.ts +1 -0
- package/dist/types/modes/controllers/event-controller.d.ts +5 -0
- package/dist/types/modes/controllers/input-controller.d.ts +1 -3
- package/dist/types/modes/controllers/selector-controller.d.ts +1 -0
- package/dist/types/modes/interactive-mode.d.ts +4 -0
- package/dist/types/modes/print-mode.d.ts +13 -1
- package/dist/types/modes/prompt-action-autocomplete.d.ts +1 -1
- package/dist/types/modes/rpc/rpc-mode.d.ts +1 -3
- package/dist/types/modes/rpc/rpc-socket-security.d.ts +3 -0
- package/dist/types/modes/rpc/rpc-types.d.ts +14 -0
- package/dist/types/modes/shared/agent-wire/event-contract.d.ts +19 -0
- package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +23 -1
- package/dist/types/modes/types.d.ts +3 -0
- package/dist/types/modes/utils/injected-user-submission.d.ts +52 -0
- package/dist/types/modes/utils/ui-helpers.d.ts +1 -0
- package/dist/types/notifications/config-commands.d.ts +9 -0
- package/dist/types/notifications/config.d.ts +30 -1
- package/dist/types/notifications/daemon-paths.d.ts +1 -0
- package/dist/types/notifications/index.d.ts +8 -3
- package/dist/types/notifications/lifecycle-commands.d.ts +12 -3
- package/dist/types/notifications/lifecycle-control-runtime.d.ts +2 -1
- package/dist/types/notifications/reply-sent-store.d.ts +53 -0
- package/dist/types/notifications/rich-draft.d.ts +68 -0
- package/dist/types/notifications/rich-render.d.ts +90 -0
- package/dist/types/notifications/telegram-daemon.d.ts +45 -3
- package/dist/types/notifications/telegram-reference.d.ts +7 -5
- package/dist/types/notifications/threaded-render.d.ts +14 -0
- package/dist/types/runtime-api-key.d.ts +7 -0
- package/dist/types/sdk.d.ts +3 -0
- package/dist/types/session/agent-session.d.ts +61 -6
- package/dist/types/session/agent-storage.d.ts +1 -0
- package/dist/types/session/file-mention-pruning.d.ts +8 -0
- package/dist/types/session/messages.d.ts +4 -0
- package/dist/types/session/session-manager.d.ts +17 -1
- package/dist/types/skc-runtime/deep-interview-ambiguity.d.ts +39 -0
- package/dist/types/skc-runtime/deep-interview-recorder.d.ts +10 -1
- package/dist/types/skc-runtime/deep-interview-state.d.ts +17 -2
- package/dist/types/skc-runtime/session-state-sidecar.d.ts +7 -0
- package/dist/types/skc-runtime/state-writer.d.ts +3 -0
- package/dist/types/skc-runtime/tmux-common.d.ts +1 -0
- package/dist/types/skc-runtime/ultragoal-receipt-freshness.d.ts +42 -0
- package/dist/types/skc-runtime/ultragoal-runtime.d.ts +120 -13
- package/dist/types/skill-state/active-state.d.ts +18 -1
- package/dist/types/system-prompt.d.ts +18 -2
- package/dist/types/task/executor.d.ts +3 -0
- package/dist/types/task/fork-context-budget.d.ts +7 -0
- package/dist/types/task/token-log.d.ts +30 -0
- package/dist/types/task/token-log.test.d.ts +1 -0
- package/dist/types/tools/bisect.d.ts +81 -0
- package/dist/types/tools/computer.d.ts +2 -2
- package/dist/types/tools/index.d.ts +1 -0
- package/dist/types/tools/search.d.ts +2 -2
- package/dist/types/tools/ultragoal-ask-guard.d.ts +9 -2
- package/dist/types/utils/file-mentions.d.ts +14 -0
- package/dist/types/utils/git.d.ts +32 -0
- package/dist/types/utils/pasted-image-path.d.ts +30 -0
- package/dist/types/web/scrapers/youtube.d.ts +8 -0
- package/dist/types/workflow/workflow-intent-diff.d.ts +8 -2
- package/dist/types/workflow/workflow-intent-report-consumer.d.ts +50 -0
- package/dist/types/workflow/workflow-intent-report-schema.d.ts +2 -0
- package/dist/types/workflow/workflow-intent-report.d.ts +48 -0
- package/package.json +8 -8
- package/src/append-only-mode.ts +58 -0
- package/src/autoresearch/prompt.md +1 -1
- package/src/autoresearch/tools/log-experiment.ts +1 -1
- package/src/capability/rule.ts +9 -0
- package/src/cli/completion-cli.ts +234 -0
- package/src/cli/config-cli.ts +61 -9
- package/src/cli/fast-help.ts +1 -0
- package/src/cli/fixture-report.test.ts +230 -0
- package/src/cli/fixture-report.ts +171 -0
- package/src/cli/nofile-limit.ts +48 -0
- package/src/cli/notify-cli.ts +103 -17
- package/src/cli/telegram-cli.ts +1 -1
- package/src/cli/update-cli.ts +148 -33
- package/src/cli.ts +29 -1
- package/src/commands/completion.ts +84 -0
- package/src/commands/config.ts +2 -0
- package/src/commands/contribution-prep.ts +1 -1
- package/src/commands/deep-interview.ts +2 -1
- package/src/config/file-lock.ts +73 -34
- package/src/config/keybindings.ts +3 -3
- package/src/config/model-profile-activation.ts +65 -0
- package/src/config/model-profiles.ts +31 -2
- package/src/config/settings-schema.ts +76 -1
- package/src/config/settings.ts +22 -0
- package/src/defaults/skc/skills/team/SKILL.md +17 -14
- package/src/defaults/skc/skills/ultragoal/SKILL.md +59 -4
- package/src/defaults/skc/skills/ultragoal/pipeline-validation-contracts.md +30 -0
- package/src/defaults/skc-defaults.ts +9 -0
- package/src/discovery/helpers.ts +10 -0
- package/src/discovery/index.ts +1 -0
- package/src/export/html/template.generated.ts +1 -1
- package/src/export/html/template.js +60 -2
- package/src/export/ttsr.ts +96 -18
- package/src/extensibility/extensions/runner.ts +183 -219
- package/src/extensibility/extensions/types.ts +9 -0
- package/src/extensibility/skc-plugins/runtime-adapters.ts +156 -44
- package/src/goals/runtime.ts +10 -2
- package/src/hindsight/backend.ts +1 -3
- package/src/hooks/native-skill-hook.ts +124 -4
- package/src/internal-urls/docs-index.generated.ts +17 -8
- package/src/lsp/client.ts +1 -0
- package/src/main.ts +95 -43
- package/src/memories/index.ts +12 -1
- package/src/modes/components/assistant-message.ts +241 -82
- package/src/modes/components/custom-editor.ts +1 -0
- package/src/modes/components/footer.ts +7 -2
- package/src/modes/components/model-selector.ts +54 -11
- package/src/modes/components/queued-message-selector.ts +92 -0
- package/src/modes/components/settings-selector.ts +4 -0
- package/src/modes/components/status-line.ts +167 -54
- package/src/modes/components/thinking-selector.ts +10 -8
- package/src/modes/components/tool-execution.ts +44 -19
- package/src/modes/components/welcome.ts +181 -44
- package/src/modes/controllers/command-controller.ts +40 -4
- package/src/modes/controllers/event-controller.ts +77 -49
- package/src/modes/controllers/extension-ui-controller.ts +12 -11
- package/src/modes/controllers/input-controller.ts +192 -35
- package/src/modes/controllers/selector-controller.ts +168 -24
- package/src/modes/interactive-mode.ts +56 -16
- package/src/modes/print-mode.ts +43 -4
- package/src/modes/prompt-action-autocomplete.ts +21 -20
- package/src/modes/rpc/rpc-mode.ts +32 -12
- package/src/modes/rpc/rpc-socket-security.ts +13 -1
- package/src/modes/rpc/rpc-types.ts +9 -0
- package/src/modes/shared/agent-wire/command-validation.ts +4 -0
- package/src/modes/shared/agent-wire/event-contract.ts +22 -0
- package/src/modes/shared/agent-wire/event-envelope.ts +82 -0
- package/src/modes/shared/agent-wire/scopes.ts +1 -0
- package/src/modes/types.ts +3 -0
- package/src/modes/utils/hotkeys-markdown.ts +1 -0
- package/src/modes/utils/injected-user-submission.ts +94 -0
- package/src/modes/utils/ui-helpers.ts +20 -7
- package/src/notifications/config-commands.ts +20 -0
- package/src/notifications/config.ts +52 -5
- package/src/notifications/daemon-paths.ts +2 -0
- package/src/notifications/index.ts +144 -18
- package/src/notifications/lifecycle-commands.ts +74 -23
- package/src/notifications/lifecycle-control-runtime.ts +8 -3
- package/src/notifications/lifecycle-orchestrator.ts +19 -6
- package/src/notifications/reply-sent-store.ts +134 -0
- package/src/notifications/rich-draft.ts +107 -0
- package/src/notifications/rich-render.ts +142 -0
- package/src/notifications/telegram-daemon-control.ts +5 -3
- package/src/notifications/telegram-daemon.ts +606 -98
- package/src/notifications/telegram-reference.ts +17 -16
- package/src/notifications/threaded-render.ts +45 -2
- package/src/prompts/agents/architect.md +19 -10
- package/src/prompts/agents/critic.md +16 -18
- package/src/prompts/agents/executor.md +14 -11
- package/src/prompts/agents/planner.md +18 -13
- package/src/prompts/ci-green-request.md +3 -8
- package/src/prompts/goals/goal-continuation.md +0 -5
- package/src/prompts/goals/goal-mode-active.md +0 -5
- package/src/prompts/system/agent-creation-architect.md +2 -2
- package/src/prompts/system/plan-mode-active.md +1 -1
- package/src/prompts/system/plan-mode-subagent.md +3 -3
- package/src/prompts/system/project-prompt.md +0 -13
- package/src/prompts/system/subagent-system-prompt.md +3 -2
- package/src/prompts/system/system-prompt.md +29 -17
- package/src/prompts/system/volatile-project-context.md +10 -0
- package/src/prompts/system/web-search.md +4 -7
- package/src/prompts/tools/apply-patch.md +6 -0
- package/src/prompts/tools/ast-edit.md +1 -0
- package/src/prompts/tools/bash.md +1 -1
- package/src/prompts/tools/bisect.md +22 -0
- package/src/prompts/tools/browser.md +1 -1
- package/src/prompts/tools/computer.md +2 -2
- package/src/prompts/tools/cron.md +0 -2
- package/src/prompts/tools/eval.md +2 -2
- package/src/prompts/tools/find.md +1 -1
- package/src/prompts/tools/github.md +6 -6
- package/src/prompts/tools/goal.md +1 -3
- package/src/prompts/tools/image-gen.md +12 -5
- package/src/prompts/tools/irc.md +5 -4
- package/src/prompts/tools/job.md +2 -2
- package/src/prompts/tools/lsp.md +1 -1
- package/src/prompts/tools/monitor.md +2 -2
- package/src/prompts/tools/patch.md +2 -2
- package/src/prompts/tools/replace.md +2 -21
- package/src/prompts/tools/rewind.md +1 -1
- package/src/prompts/tools/search-tool-bm25.md +6 -11
- package/src/prompts/tools/search.md +1 -1
- package/src/prompts/tools/skill.md +3 -2
- package/src/prompts/tools/ssh.md +2 -1
- package/src/prompts/tools/subagent.md +2 -2
- package/src/prompts/tools/task.md +4 -5
- package/src/prompts/tools/todo-write.md +1 -1
- package/src/prompts/tools/vim.md +1 -0
- package/src/prompts/tools/web-search.md +2 -0
- package/src/prompts/tools/write.md +8 -2
- package/src/runtime-api-key.ts +16 -0
- package/src/sdk.ts +88 -36
- package/src/session/agent-session.ts +1013 -141
- package/src/session/agent-storage.ts +4 -0
- package/src/session/file-mention-pruning.ts +64 -0
- package/src/session/messages.ts +4 -0
- package/src/session/session-manager.ts +103 -4
- package/src/skc-runtime/deep-interview-ambiguity.ts +206 -0
- package/src/skc-runtime/deep-interview-recorder.ts +62 -8
- package/src/skc-runtime/deep-interview-state.ts +44 -2
- package/src/skc-runtime/session-state-sidecar.ts +263 -20
- package/src/skc-runtime/state-runtime.ts +12 -2
- package/src/skc-runtime/state-writer.ts +15 -0
- package/src/skc-runtime/tmux-common.ts +1 -0
- package/src/skc-runtime/ultragoal-guard.ts +55 -66
- package/src/skc-runtime/ultragoal-receipt-freshness.ts +315 -0
- package/src/skc-runtime/ultragoal-runtime.ts +1672 -159
- package/src/skc-runtime/workflow-manifest.generated.json +113 -2
- package/src/skc-runtime/workflow-manifest.ts +74 -1
- package/src/skill-state/active-state.ts +141 -5
- package/src/skill-state/deep-interview-mutation-guard.ts +67 -3
- package/src/slash-commands/builtin-registry.ts +296 -72
- package/src/system-prompt.ts +57 -16
- package/src/task/executor.ts +132 -24
- package/src/task/fork-context-advisory.ts +2 -7
- package/src/task/fork-context-budget.ts +9 -0
- package/src/task/index.ts +13 -6
- package/src/task/output-manager.ts +20 -8
- package/src/task/receipt.ts +26 -7
- package/src/task/token-log.test.ts +188 -0
- package/src/task/token-log.ts +179 -0
- package/src/tools/bisect.ts +367 -0
- package/src/tools/computer.ts +246 -43
- package/src/tools/index.ts +3 -0
- package/src/tools/output-meta.ts +116 -4
- package/src/tools/search.ts +8 -2
- package/src/tools/skill.ts +15 -0
- package/src/tools/telegram-send.ts +6 -0
- package/src/tools/ultragoal-ask-guard.ts +39 -5
- package/src/utils/file-mentions.ts +39 -7
- package/src/utils/git.ts +73 -0
- package/src/utils/pasted-image-path.ts +170 -0
- package/src/web/scrapers/youtube.ts +24 -12
- package/src/workflow/workflow-intent-diff.ts +29 -6
- package/src/workflow/workflow-intent-report-consumer.ts +221 -0
- package/src/workflow/workflow-intent-report-schema.ts +129 -0
- package/src/workflow/workflow-intent-report.ts +135 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import type { SessionEntry } from "../session/session-manager";
|
|
2
|
+
import {
|
|
3
|
+
WORKFLOW_INTENT_DIFF_CUSTOM_TYPE,
|
|
4
|
+
WORKFLOW_INTENT_ROUTES,
|
|
5
|
+
type WorkflowIntentDiff,
|
|
6
|
+
type WorkflowIntentRoute,
|
|
7
|
+
} from "./workflow-intent-diff";
|
|
8
|
+
import type { WorkflowSignalObserver } from "./workflow-intent-report";
|
|
9
|
+
import { parseWorkflowIntentDiffPayload } from "./workflow-intent-report-schema";
|
|
10
|
+
|
|
11
|
+
export type WorkflowConsumerConfidence = "none" | "low" | "medium" | "high";
|
|
12
|
+
|
|
13
|
+
export interface WorkflowRouteCounts {
|
|
14
|
+
readonly direct: number;
|
|
15
|
+
readonly "deep-interview": number;
|
|
16
|
+
readonly ralplan: number;
|
|
17
|
+
readonly ultragoal: number;
|
|
18
|
+
readonly team: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface WorkflowIntentReportEntry {
|
|
22
|
+
readonly entryId: string;
|
|
23
|
+
readonly timestamp: string;
|
|
24
|
+
readonly intent: WorkflowIntentDiff;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface WorkflowIntentReportTotals {
|
|
28
|
+
readonly total: number;
|
|
29
|
+
readonly byRoute: WorkflowRouteCounts;
|
|
30
|
+
readonly escalationRequired: number;
|
|
31
|
+
readonly rootCauseActive: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface WorkflowIntentReportCollection {
|
|
35
|
+
readonly entries: readonly WorkflowIntentReportEntry[];
|
|
36
|
+
readonly latest: WorkflowIntentReportEntry | undefined;
|
|
37
|
+
readonly totals: WorkflowIntentReportTotals;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface WorkflowObserverSignalSummary {
|
|
41
|
+
readonly observer: WorkflowSignalObserver;
|
|
42
|
+
readonly conclusion: string;
|
|
43
|
+
readonly count: number;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface WorkflowConsensusSummary {
|
|
47
|
+
readonly total: number;
|
|
48
|
+
readonly dominantRoute: WorkflowIntentRoute | undefined;
|
|
49
|
+
readonly confidence: WorkflowConsumerConfidence;
|
|
50
|
+
readonly escalationGate: {
|
|
51
|
+
readonly required: boolean;
|
|
52
|
+
readonly count: number;
|
|
53
|
+
readonly latestReason: string | undefined;
|
|
54
|
+
};
|
|
55
|
+
readonly rootCausePhase: {
|
|
56
|
+
readonly active: boolean;
|
|
57
|
+
readonly count: number;
|
|
58
|
+
readonly triggers: readonly string[];
|
|
59
|
+
};
|
|
60
|
+
readonly observerSignals: readonly WorkflowObserverSignalSummary[];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function emptyRouteCounts(): WorkflowRouteCounts {
|
|
64
|
+
return {
|
|
65
|
+
direct: 0,
|
|
66
|
+
"deep-interview": 0,
|
|
67
|
+
ralplan: 0,
|
|
68
|
+
ultragoal: 0,
|
|
69
|
+
team: 0,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function parseWorkflowIntentDiffEntry(entry: SessionEntry): WorkflowIntentReportEntry | undefined {
|
|
74
|
+
if (entry.type !== "custom" || entry.customType !== WORKFLOW_INTENT_DIFF_CUSTOM_TYPE) return undefined;
|
|
75
|
+
const intent = parseWorkflowIntentDiffPayload(entry.data);
|
|
76
|
+
if (!intent) return undefined;
|
|
77
|
+
return { entryId: entry.id, timestamp: entry.timestamp, intent };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function incrementRoute(counts: WorkflowRouteCounts, route: WorkflowIntentRoute): WorkflowRouteCounts {
|
|
81
|
+
switch (route) {
|
|
82
|
+
case "direct":
|
|
83
|
+
return { ...counts, direct: counts.direct + 1 };
|
|
84
|
+
case "deep-interview":
|
|
85
|
+
return { ...counts, "deep-interview": counts["deep-interview"] + 1 };
|
|
86
|
+
case "ralplan":
|
|
87
|
+
return { ...counts, ralplan: counts.ralplan + 1 };
|
|
88
|
+
case "ultragoal":
|
|
89
|
+
return { ...counts, ultragoal: counts.ultragoal + 1 };
|
|
90
|
+
case "team":
|
|
91
|
+
return { ...counts, team: counts.team + 1 };
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function routeCount(counts: WorkflowRouteCounts, route: WorkflowIntentRoute): number {
|
|
96
|
+
switch (route) {
|
|
97
|
+
case "direct":
|
|
98
|
+
return counts.direct;
|
|
99
|
+
case "deep-interview":
|
|
100
|
+
return counts["deep-interview"];
|
|
101
|
+
case "ralplan":
|
|
102
|
+
return counts.ralplan;
|
|
103
|
+
case "ultragoal":
|
|
104
|
+
return counts.ultragoal;
|
|
105
|
+
case "team":
|
|
106
|
+
return counts.team;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function collectWorkflowIntentReports(entries: readonly SessionEntry[]): WorkflowIntentReportCollection {
|
|
111
|
+
const reports: WorkflowIntentReportEntry[] = [];
|
|
112
|
+
let byRoute = emptyRouteCounts();
|
|
113
|
+
let escalationRequired = 0;
|
|
114
|
+
let rootCauseActive = 0;
|
|
115
|
+
|
|
116
|
+
for (const entry of entries) {
|
|
117
|
+
const report = parseWorkflowIntentDiffEntry(entry);
|
|
118
|
+
if (!report) continue;
|
|
119
|
+
reports.push(report);
|
|
120
|
+
byRoute = incrementRoute(byRoute, report.intent.route);
|
|
121
|
+
if (report.intent.consensusReport.escalationGate.status === "required") escalationRequired += 1;
|
|
122
|
+
if (report.intent.rootCausePhase.status === "active") rootCauseActive += 1;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return {
|
|
126
|
+
entries: reports,
|
|
127
|
+
latest: reports[reports.length - 1],
|
|
128
|
+
totals: {
|
|
129
|
+
total: reports.length,
|
|
130
|
+
byRoute,
|
|
131
|
+
escalationRequired,
|
|
132
|
+
rootCauseActive,
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function dominantRouteFor(counts: WorkflowRouteCounts, total: number): WorkflowIntentRoute | undefined {
|
|
138
|
+
if (total === 0) return undefined;
|
|
139
|
+
let dominant: WorkflowIntentRoute | undefined;
|
|
140
|
+
let dominantCount = 0;
|
|
141
|
+
let tied = false;
|
|
142
|
+
|
|
143
|
+
for (const route of WORKFLOW_INTENT_ROUTES) {
|
|
144
|
+
const count = routeCount(counts, route);
|
|
145
|
+
if (count > dominantCount) {
|
|
146
|
+
dominant = route;
|
|
147
|
+
dominantCount = count;
|
|
148
|
+
tied = false;
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (count === dominantCount && count > 0) tied = true;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return tied ? undefined : dominant;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function confidenceFor(
|
|
158
|
+
total: number,
|
|
159
|
+
dominantCount: number,
|
|
160
|
+
dominantRoute: WorkflowIntentRoute | undefined,
|
|
161
|
+
): WorkflowConsumerConfidence {
|
|
162
|
+
if (total === 0) return "none";
|
|
163
|
+
if (!dominantRoute) return "low";
|
|
164
|
+
const ratio = dominantCount / total;
|
|
165
|
+
if (ratio === 1) return "high";
|
|
166
|
+
if (ratio >= 0.5) return "medium";
|
|
167
|
+
return "low";
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function summarizeWorkflowConsensus(intents: readonly WorkflowIntentDiff[]): WorkflowConsensusSummary {
|
|
171
|
+
let byRoute = emptyRouteCounts();
|
|
172
|
+
let escalationCount = 0;
|
|
173
|
+
let latestEscalationReason: string | undefined;
|
|
174
|
+
let activeRootCauseCount = 0;
|
|
175
|
+
const rootCauseTriggers: string[] = [];
|
|
176
|
+
const observerSignalCounts = new Map<string, WorkflowObserverSignalSummary>();
|
|
177
|
+
|
|
178
|
+
for (const intent of intents) {
|
|
179
|
+
byRoute = incrementRoute(byRoute, intent.route);
|
|
180
|
+
if (intent.consensusReport.escalationGate.status === "required") {
|
|
181
|
+
escalationCount += 1;
|
|
182
|
+
latestEscalationReason = intent.consensusReport.escalationGate.reason;
|
|
183
|
+
}
|
|
184
|
+
if (intent.rootCausePhase.status === "active") {
|
|
185
|
+
activeRootCauseCount += 1;
|
|
186
|
+
for (const trigger of intent.rootCausePhase.triggers) {
|
|
187
|
+
if (!rootCauseTriggers.includes(trigger)) rootCauseTriggers.push(trigger);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
for (const signal of intent.consensusReport.observerSignals) {
|
|
191
|
+
const key = `${signal.observer}\u0000${signal.conclusion}`;
|
|
192
|
+
const existing = observerSignalCounts.get(key);
|
|
193
|
+
observerSignalCounts.set(key, {
|
|
194
|
+
observer: signal.observer,
|
|
195
|
+
conclusion: signal.conclusion,
|
|
196
|
+
count: existing ? existing.count + 1 : 1,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const total = intents.length;
|
|
202
|
+
const dominantRoute = dominantRouteFor(byRoute, total);
|
|
203
|
+
const dominantCount = dominantRoute ? routeCount(byRoute, dominantRoute) : 0;
|
|
204
|
+
|
|
205
|
+
return {
|
|
206
|
+
total,
|
|
207
|
+
dominantRoute,
|
|
208
|
+
confidence: confidenceFor(total, dominantCount, dominantRoute),
|
|
209
|
+
escalationGate: {
|
|
210
|
+
required: escalationCount > 0,
|
|
211
|
+
count: escalationCount,
|
|
212
|
+
latestReason: latestEscalationReason,
|
|
213
|
+
},
|
|
214
|
+
rootCausePhase: {
|
|
215
|
+
active: activeRootCauseCount > 0,
|
|
216
|
+
count: activeRootCauseCount,
|
|
217
|
+
triggers: rootCauseTriggers,
|
|
218
|
+
},
|
|
219
|
+
observerSignals: Array.from(observerSignalCounts.values()),
|
|
220
|
+
};
|
|
221
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import * as z from "zod/v4";
|
|
2
|
+
import { WORKFLOW_ESCALATION_ROUTES, WORKFLOW_INTENT_ROUTES, type WorkflowIntentDiff } from "./workflow-intent-diff";
|
|
3
|
+
|
|
4
|
+
const WORKFLOW_CLAIM_IDS = ["workflow-route", "root-cause-phase", "escalation-gate"] as const;
|
|
5
|
+
const WORKFLOW_OBSERVERS = ["intent-router", "root-cause-schema", "escalation-gate"] as const;
|
|
6
|
+
|
|
7
|
+
const WorkflowIntentRouteSchema = z.enum(WORKFLOW_INTENT_ROUTES);
|
|
8
|
+
const WorkflowEscalationRouteSchema = z.enum(WORKFLOW_ESCALATION_ROUTES);
|
|
9
|
+
const WorkflowRootCausePhaseSchema = z.object({
|
|
10
|
+
status: z.enum(["active", "inactive"]),
|
|
11
|
+
triggers: z.array(z.string()),
|
|
12
|
+
});
|
|
13
|
+
const WorkflowClaimsLedgerSchema = z.object({
|
|
14
|
+
version: z.literal(1),
|
|
15
|
+
claims: z.array(
|
|
16
|
+
z.object({
|
|
17
|
+
id: z.enum(WORKFLOW_CLAIM_IDS),
|
|
18
|
+
statement: z.string(),
|
|
19
|
+
status: z.literal("confirmed"),
|
|
20
|
+
confidence: z.literal("high"),
|
|
21
|
+
evidence: z.array(z.string()),
|
|
22
|
+
}),
|
|
23
|
+
),
|
|
24
|
+
});
|
|
25
|
+
const WorkflowConsensusReportSchema = z.object({
|
|
26
|
+
version: z.literal(1),
|
|
27
|
+
route: WorkflowIntentRouteSchema,
|
|
28
|
+
confidence: z.literal("high"),
|
|
29
|
+
summary: z.string(),
|
|
30
|
+
observerSignals: z.array(
|
|
31
|
+
z.object({
|
|
32
|
+
observer: z.enum(WORKFLOW_OBSERVERS),
|
|
33
|
+
conclusion: z.string(),
|
|
34
|
+
evidence: z.array(z.string()),
|
|
35
|
+
}),
|
|
36
|
+
),
|
|
37
|
+
escalationGate: z.object({
|
|
38
|
+
status: z.enum(["required", "not-required"]),
|
|
39
|
+
reason: z.string(),
|
|
40
|
+
}),
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const WorkflowIntentDiffSchema = z
|
|
44
|
+
.object({
|
|
45
|
+
version: z.literal(1),
|
|
46
|
+
route: WorkflowIntentRouteSchema,
|
|
47
|
+
reason: z.string(),
|
|
48
|
+
directTracking: z.enum(["custom-entry-only", "not-direct"]),
|
|
49
|
+
recommendedSkill: WorkflowEscalationRouteSchema.optional(),
|
|
50
|
+
recommendedInvocation: z.string().optional(),
|
|
51
|
+
triggers: z.array(z.string()),
|
|
52
|
+
rootCausePhase: WorkflowRootCausePhaseSchema,
|
|
53
|
+
claimsLedger: WorkflowClaimsLedgerSchema,
|
|
54
|
+
consensusReport: WorkflowConsensusReportSchema,
|
|
55
|
+
promptPreview: z.string(),
|
|
56
|
+
})
|
|
57
|
+
.superRefine((intent, ctx) => {
|
|
58
|
+
const direct = intent.route === "direct";
|
|
59
|
+
const expectedTracking = direct ? "custom-entry-only" : "not-direct";
|
|
60
|
+
const expectedGateStatus = direct ? "not-required" : "required";
|
|
61
|
+
|
|
62
|
+
if (intent.directTracking !== expectedTracking) {
|
|
63
|
+
ctx.addIssue({
|
|
64
|
+
code: "custom",
|
|
65
|
+
path: ["directTracking"],
|
|
66
|
+
message: `directTracking must be ${expectedTracking} for route ${intent.route}`,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (intent.consensusReport.route !== intent.route) {
|
|
70
|
+
ctx.addIssue({
|
|
71
|
+
code: "custom",
|
|
72
|
+
path: ["consensusReport", "route"],
|
|
73
|
+
message: "consensus route must match the top-level workflow route",
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
if (intent.consensusReport.escalationGate.status !== expectedGateStatus) {
|
|
77
|
+
ctx.addIssue({
|
|
78
|
+
code: "custom",
|
|
79
|
+
path: ["consensusReport", "escalationGate", "status"],
|
|
80
|
+
message: `escalation gate must be ${expectedGateStatus} for route ${intent.route}`,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
if (direct) {
|
|
84
|
+
if (intent.recommendedSkill !== undefined || intent.recommendedInvocation !== undefined) {
|
|
85
|
+
ctx.addIssue({
|
|
86
|
+
code: "custom",
|
|
87
|
+
path: ["recommendedSkill"],
|
|
88
|
+
message: "direct workflow reports must not carry escalation recommendations",
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
} else {
|
|
92
|
+
if (intent.recommendedSkill !== intent.route || intent.recommendedInvocation === undefined) {
|
|
93
|
+
ctx.addIssue({
|
|
94
|
+
code: "custom",
|
|
95
|
+
path: ["recommendedSkill"],
|
|
96
|
+
message: "escalated workflow reports must carry matching recommendations",
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
for (const signal of intent.consensusReport.observerSignals) {
|
|
102
|
+
if (signal.observer === "intent-router" && signal.conclusion !== intent.route) {
|
|
103
|
+
ctx.addIssue({
|
|
104
|
+
code: "custom",
|
|
105
|
+
path: ["consensusReport", "observerSignals"],
|
|
106
|
+
message: "intent-router signal must match the top-level workflow route",
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
if (signal.observer === "root-cause-schema" && signal.conclusion !== intent.rootCausePhase.status) {
|
|
110
|
+
ctx.addIssue({
|
|
111
|
+
code: "custom",
|
|
112
|
+
path: ["consensusReport", "observerSignals"],
|
|
113
|
+
message: "root-cause-schema signal must match the root-cause phase status",
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
if (signal.observer === "escalation-gate" && signal.conclusion !== expectedGateStatus) {
|
|
117
|
+
ctx.addIssue({
|
|
118
|
+
code: "custom",
|
|
119
|
+
path: ["consensusReport", "observerSignals"],
|
|
120
|
+
message: "escalation-gate signal must match the escalation gate status",
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
export function parseWorkflowIntentDiffPayload(value: unknown): WorkflowIntentDiff | undefined {
|
|
127
|
+
const result = WorkflowIntentDiffSchema.safeParse(value);
|
|
128
|
+
return result.success ? result.data : undefined;
|
|
129
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type { RootCausePhaseStatus, WorkflowIntentRoute } from "./workflow-intent-diff";
|
|
2
|
+
|
|
3
|
+
export type WorkflowConfidence = "high";
|
|
4
|
+
export type WorkflowClaimStatus = "confirmed";
|
|
5
|
+
export type WorkflowEscalationGateStatus = "required" | "not-required";
|
|
6
|
+
export type WorkflowSignalObserver = "intent-router" | "root-cause-schema" | "escalation-gate";
|
|
7
|
+
|
|
8
|
+
export interface WorkflowClaim {
|
|
9
|
+
readonly id: "workflow-route" | "root-cause-phase" | "escalation-gate";
|
|
10
|
+
readonly statement: string;
|
|
11
|
+
readonly status: WorkflowClaimStatus;
|
|
12
|
+
readonly confidence: WorkflowConfidence;
|
|
13
|
+
readonly evidence: readonly string[];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface WorkflowClaimsLedger {
|
|
17
|
+
readonly version: 1;
|
|
18
|
+
readonly claims: readonly WorkflowClaim[];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface WorkflowObserverSignal {
|
|
22
|
+
readonly observer: WorkflowSignalObserver;
|
|
23
|
+
readonly conclusion: string;
|
|
24
|
+
readonly evidence: readonly string[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface WorkflowConsensusReport {
|
|
28
|
+
readonly version: 1;
|
|
29
|
+
readonly route: WorkflowIntentRoute;
|
|
30
|
+
readonly confidence: WorkflowConfidence;
|
|
31
|
+
readonly summary: string;
|
|
32
|
+
readonly observerSignals: readonly WorkflowObserverSignal[];
|
|
33
|
+
readonly escalationGate: {
|
|
34
|
+
readonly status: WorkflowEscalationGateStatus;
|
|
35
|
+
readonly reason: string;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface WorkflowIntentReport {
|
|
40
|
+
readonly claimsLedger: WorkflowClaimsLedger;
|
|
41
|
+
readonly consensusReport: WorkflowConsensusReport;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface WorkflowIntentReportInput {
|
|
45
|
+
readonly route: WorkflowIntentRoute;
|
|
46
|
+
readonly reason: string;
|
|
47
|
+
readonly direct: boolean;
|
|
48
|
+
readonly recommendedInvocation?: string;
|
|
49
|
+
readonly triggers: readonly string[];
|
|
50
|
+
readonly rootCausePhase: {
|
|
51
|
+
readonly status: RootCausePhaseStatus;
|
|
52
|
+
readonly triggers: readonly string[];
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function triggerEvidence(triggers: readonly string[]): readonly string[] {
|
|
57
|
+
return triggers.map(trigger => `trigger: ${trigger}`);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function rootCauseEvidence(input: WorkflowIntentReportInput): readonly string[] {
|
|
61
|
+
if (input.rootCausePhase.status === "inactive") return ["root-cause: inactive"];
|
|
62
|
+
return ["root-cause: active", ...input.rootCausePhase.triggers.map(trigger => `root-cause-trigger: ${trigger}`)];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function escalationEvidence(input: WorkflowIntentReportInput): readonly string[] {
|
|
66
|
+
if (input.direct) return ["escalation: not-required", `reason: ${input.reason}`];
|
|
67
|
+
return ["escalation: required", `invocation: ${input.recommendedInvocation ?? input.route}`];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function escalationGate(input: WorkflowIntentReportInput): WorkflowConsensusReport["escalationGate"] {
|
|
71
|
+
if (input.direct) {
|
|
72
|
+
return {
|
|
73
|
+
status: "not-required",
|
|
74
|
+
reason: input.reason,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
status: "required",
|
|
79
|
+
reason: input.recommendedInvocation ?? input.route,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function consensusSummary(input: WorkflowIntentReportInput): string {
|
|
84
|
+
if (input.direct) return "Consensus: direct implementation with CustomEntry-only workflow traceability.";
|
|
85
|
+
return `Consensus: route through ${input.recommendedInvocation ?? input.route} because ${input.reason}.`;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function buildWorkflowIntentReport(input: WorkflowIntentReportInput): WorkflowIntentReport {
|
|
89
|
+
const confidence: WorkflowConfidence = "high";
|
|
90
|
+
const gate = escalationGate(input);
|
|
91
|
+
const routeEvidence = [`route: ${input.route}`, `reason: ${input.reason}`, ...triggerEvidence(input.triggers)];
|
|
92
|
+
const causeEvidence = rootCauseEvidence(input);
|
|
93
|
+
const gateEvidence = escalationEvidence(input);
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
claimsLedger: {
|
|
97
|
+
version: 1,
|
|
98
|
+
claims: [
|
|
99
|
+
{
|
|
100
|
+
id: "workflow-route",
|
|
101
|
+
statement: `Prompt should follow the ${input.route} workflow route.`,
|
|
102
|
+
status: "confirmed",
|
|
103
|
+
confidence,
|
|
104
|
+
evidence: routeEvidence,
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
id: "root-cause-phase",
|
|
108
|
+
statement: `Root-cause phase is ${input.rootCausePhase.status}.`,
|
|
109
|
+
status: "confirmed",
|
|
110
|
+
confidence,
|
|
111
|
+
evidence: causeEvidence,
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
id: "escalation-gate",
|
|
115
|
+
statement: `Escalation gate is ${gate.status}.`,
|
|
116
|
+
status: "confirmed",
|
|
117
|
+
confidence,
|
|
118
|
+
evidence: gateEvidence,
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
},
|
|
122
|
+
consensusReport: {
|
|
123
|
+
version: 1,
|
|
124
|
+
route: input.route,
|
|
125
|
+
confidence,
|
|
126
|
+
summary: consensusSummary(input),
|
|
127
|
+
observerSignals: [
|
|
128
|
+
{ observer: "intent-router", conclusion: input.route, evidence: routeEvidence },
|
|
129
|
+
{ observer: "root-cause-schema", conclusion: input.rootCausePhase.status, evidence: causeEvidence },
|
|
130
|
+
{ observer: "escalation-gate", conclusion: gate.status, evidence: gateEvidence },
|
|
131
|
+
],
|
|
132
|
+
escalationGate: gate,
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|