@pedrocivita/tocket 2.5.0 → 2.6.4
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 +233 -18
- package/dist/commands/agents-md.cmd.d.ts +2 -0
- package/dist/commands/agents-md.cmd.js +166 -0
- package/dist/commands/agents-md.cmd.js.map +1 -0
- package/dist/commands/decide.cmd.d.ts +2 -0
- package/dist/commands/decide.cmd.js +70 -0
- package/dist/commands/decide.cmd.js.map +1 -0
- package/dist/commands/doctor.cmd.d.ts +13 -0
- package/dist/commands/doctor.cmd.js +135 -11
- package/dist/commands/doctor.cmd.js.map +1 -1
- package/dist/commands/eject.cmd.d.ts +1 -1
- package/dist/commands/eject.cmd.js +3 -1
- package/dist/commands/eject.cmd.js.map +1 -1
- package/dist/commands/init.cmd.js +67 -13
- package/dist/commands/init.cmd.js.map +1 -1
- package/dist/commands/scaffold.cmd.d.ts +2 -0
- package/dist/commands/scaffold.cmd.js +118 -0
- package/dist/commands/scaffold.cmd.js.map +1 -0
- package/dist/commands/suite.cmd.d.ts +2 -0
- package/dist/commands/suite.cmd.js +387 -0
- package/dist/commands/suite.cmd.js.map +1 -0
- package/dist/commands/validate.cmd.js +1 -0
- package/dist/commands/validate.cmd.js.map +1 -1
- package/dist/commands/work.cmd.d.ts +2 -0
- package/dist/commands/work.cmd.js +48 -0
- package/dist/commands/work.cmd.js.map +1 -0
- package/dist/eval/decide-eval.d.ts +28 -0
- package/dist/eval/decide-eval.js +34 -0
- package/dist/eval/decide-eval.js.map +1 -0
- package/dist/eval/triage-eval.d.ts +46 -0
- package/dist/eval/triage-eval.js +175 -0
- package/dist/eval/triage-eval.js.map +1 -0
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +7 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.js +360 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/templates/memory-bank.d.ts +11 -0
- package/dist/templates/memory-bank.js +456 -329
- package/dist/templates/memory-bank.js.map +1 -1
- package/dist/tests/agents.test.js +73 -1
- package/dist/tests/agents.test.js.map +1 -1
- package/dist/tests/context.test.js +10 -1
- package/dist/tests/context.test.js.map +1 -1
- package/dist/tests/decide.test.d.ts +1 -0
- package/dist/tests/decide.test.js +483 -0
- package/dist/tests/decide.test.js.map +1 -0
- package/dist/tests/doctor.test.js +74 -1
- package/dist/tests/doctor.test.js.map +1 -1
- package/dist/tests/eject.test.js +3 -0
- package/dist/tests/eject.test.js.map +1 -1
- package/dist/tests/git.test.js +17 -0
- package/dist/tests/git.test.js.map +1 -1
- package/dist/tests/helpers.d.ts +6 -0
- package/dist/tests/helpers.js +13 -0
- package/dist/tests/helpers.js.map +1 -0
- package/dist/tests/helpers.test.d.ts +1 -0
- package/dist/tests/helpers.test.js +23 -0
- package/dist/tests/helpers.test.js.map +1 -0
- package/dist/tests/init.test.js +85 -5
- package/dist/tests/init.test.js.map +1 -1
- package/dist/tests/loop.test.d.ts +1 -0
- package/dist/tests/loop.test.js +153 -0
- package/dist/tests/loop.test.js.map +1 -0
- package/dist/tests/memory-bank.test.js +53 -1
- package/dist/tests/memory-bank.test.js.map +1 -1
- package/dist/tests/suite.test.d.ts +1 -0
- package/dist/tests/suite.test.js +199 -0
- package/dist/tests/suite.test.js.map +1 -0
- package/dist/tests/triage.test.d.ts +1 -0
- package/dist/tests/triage.test.js +152 -0
- package/dist/tests/triage.test.js.map +1 -0
- package/dist/tests/work.test.d.ts +1 -0
- package/dist/tests/work.test.js +276 -0
- package/dist/tests/work.test.js.map +1 -0
- package/dist/utils/agents.d.ts +25 -0
- package/dist/utils/agents.js +92 -0
- package/dist/utils/agents.js.map +1 -1
- package/dist/utils/appmaps.d.ts +65 -0
- package/dist/utils/appmaps.js +280 -0
- package/dist/utils/appmaps.js.map +1 -0
- package/dist/utils/context.d.ts +2 -0
- package/dist/utils/context.js +21 -0
- package/dist/utils/context.js.map +1 -1
- package/dist/utils/decide.d.ts +178 -0
- package/dist/utils/decide.js +614 -0
- package/dist/utils/decide.js.map +1 -0
- package/dist/utils/git.js +8 -1
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/jev.d.ts +83 -0
- package/dist/utils/jev.js +190 -0
- package/dist/utils/jev.js.map +1 -0
- package/dist/utils/triage.d.ts +87 -0
- package/dist/utils/triage.js +241 -0
- package/dist/utils/triage.js.map +1 -0
- package/dist/utils/work.d.ts +72 -0
- package/dist/utils/work.js +225 -0
- package/dist/utils/work.js.map +1 -0
- package/package.json +53 -50
|
@@ -0,0 +1,614 @@
|
|
|
1
|
+
/** Generic Choice/Noul decisions. File-first; writes only under `.context/decisions/`. */
|
|
2
|
+
import { mkdirSync, readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
3
|
+
import { dirname, resolve, sep } from "node:path";
|
|
4
|
+
import { JEV_MODEL, askJev, readTypesafeApiKey, } from "./jev.js";
|
|
5
|
+
export { toRepoRelative } from "./context.js";
|
|
6
|
+
export const DECIDE_SCHEMA = "tocket.decide/v0";
|
|
7
|
+
export const DECISIONS_DIR = ".context/decisions";
|
|
8
|
+
export const DECISIONS_README = "README.md";
|
|
9
|
+
export const STUB_MODEL = "stub-v0";
|
|
10
|
+
/** Codila chief.py default: only route research/write at or above this confidence. */
|
|
11
|
+
export const DEFAULT_CONFIDENCE_THRESHOLD = 0.85;
|
|
12
|
+
export const QUEUE_DESTINATIONS = ["research", "write", "review"];
|
|
13
|
+
export const HIGH_CONFIDENCE_ROUTES = ["research", "write"];
|
|
14
|
+
export const BOUNDED_FORKS = ["agent", "model", "tool", "action", "human"];
|
|
15
|
+
export const DECIDE_LOOP = "state-questions-action-verify";
|
|
16
|
+
export const RANK_WIDE_MIN = 5;
|
|
17
|
+
/** Well-known Choice names for the file-first tool-risk gate (AutoMode pattern, not LangChain APIs). */
|
|
18
|
+
export const TOOL_GATE_NAMES = ["tool_gate", "action_gate"];
|
|
19
|
+
export const TOOL_GATE_OPTIONS = ["allow", "block", "ask"];
|
|
20
|
+
export class DecideError extends Error {
|
|
21
|
+
constructor(message) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.name = "DecideError";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function isRecord(value) {
|
|
27
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
28
|
+
}
|
|
29
|
+
export function parseChoiceSpec(spec) {
|
|
30
|
+
const trimmed = spec.trim();
|
|
31
|
+
const colon = trimmed.indexOf(":");
|
|
32
|
+
if (colon <= 0 || colon === trimmed.length - 1) {
|
|
33
|
+
throw new DecideError(`Invalid --choice spec "${spec}". Use name:opt1,opt2.`);
|
|
34
|
+
}
|
|
35
|
+
const name = slugId(trimmed.slice(0, colon));
|
|
36
|
+
const options = trimmed
|
|
37
|
+
.slice(colon + 1)
|
|
38
|
+
.split(",")
|
|
39
|
+
.map((item) => item.trim())
|
|
40
|
+
.filter(Boolean);
|
|
41
|
+
if (options.length < 2) {
|
|
42
|
+
throw new DecideError(`--choice ${name} needs at least two options.`);
|
|
43
|
+
}
|
|
44
|
+
return { name, options };
|
|
45
|
+
}
|
|
46
|
+
export function parseNoulSpec(spec) {
|
|
47
|
+
const name = slugId(spec);
|
|
48
|
+
if (!name || name === "decision") {
|
|
49
|
+
throw new DecideError(`Invalid --noul name "${spec}".`);
|
|
50
|
+
}
|
|
51
|
+
return { name };
|
|
52
|
+
}
|
|
53
|
+
export function parseScoreSpec(spec) {
|
|
54
|
+
const trimmed = spec.trim();
|
|
55
|
+
const colon = trimmed.indexOf(":");
|
|
56
|
+
if (colon === -1) {
|
|
57
|
+
const name = slugId(trimmed);
|
|
58
|
+
if (!name || name === "decision") {
|
|
59
|
+
throw new DecideError(`Invalid --score name "${spec}".`);
|
|
60
|
+
}
|
|
61
|
+
return { name, min: 0, max: 1 };
|
|
62
|
+
}
|
|
63
|
+
const name = slugId(trimmed.slice(0, colon));
|
|
64
|
+
const scale = trimmed
|
|
65
|
+
.slice(colon + 1)
|
|
66
|
+
.split(",")
|
|
67
|
+
.map((item) => Number(item.trim()));
|
|
68
|
+
if (name === "decision" || scale.length !== 2 || !scale.every(Number.isFinite) || scale[0] >= scale[1]) {
|
|
69
|
+
throw new DecideError(`Invalid --score spec "${spec}". Use name or name:min,max.`);
|
|
70
|
+
}
|
|
71
|
+
return { name, min: scale[0], max: scale[1] };
|
|
72
|
+
}
|
|
73
|
+
export function parseFork(raw) {
|
|
74
|
+
const value = (raw ?? "action").trim().toLowerCase();
|
|
75
|
+
if (!BOUNDED_FORKS.includes(value)) {
|
|
76
|
+
throw new DecideError(`--fork must be one of ${BOUNDED_FORKS.join(", ")}.`);
|
|
77
|
+
}
|
|
78
|
+
return value;
|
|
79
|
+
}
|
|
80
|
+
const CODILA_CRITERIA = {
|
|
81
|
+
research: "Collect evidence still needed for the goal.",
|
|
82
|
+
write: "Draft from sufficient evidence.",
|
|
83
|
+
review: "Goal unclear, outside scope, or work complete.",
|
|
84
|
+
allow: "The proposed tool or action is in scope and reversible enough to proceed.",
|
|
85
|
+
block: "Refuse the proposed tool or action; too risky or out of scope.",
|
|
86
|
+
ask: "Escalate to a human before running the proposed tool or action.",
|
|
87
|
+
};
|
|
88
|
+
export function choiceCriterion(option) {
|
|
89
|
+
return CODILA_CRITERIA[option] ?? `Prefer ${option} when the state indicates ${option}.`;
|
|
90
|
+
}
|
|
91
|
+
export function isQueueDestination(value) {
|
|
92
|
+
return QUEUE_DESTINATIONS.includes(value);
|
|
93
|
+
}
|
|
94
|
+
export function isHighConfidenceRoute(value) {
|
|
95
|
+
return HIGH_CONFIDENCE_ROUTES.includes(value);
|
|
96
|
+
}
|
|
97
|
+
export function isToolGateName(name) {
|
|
98
|
+
return TOOL_GATE_NAMES.includes(name);
|
|
99
|
+
}
|
|
100
|
+
export function isToolGate(value) {
|
|
101
|
+
return value != null && TOOL_GATE_OPTIONS.includes(value);
|
|
102
|
+
}
|
|
103
|
+
export function parseToolGate(value) {
|
|
104
|
+
if (typeof value !== "string")
|
|
105
|
+
return null;
|
|
106
|
+
const normalized = value.trim().toLowerCase();
|
|
107
|
+
return isToolGate(normalized) ? normalized : null;
|
|
108
|
+
}
|
|
109
|
+
/** Read a well-known `tool_gate` / `action_gate` Choice from answers. */
|
|
110
|
+
export function extractToolGate(answers) {
|
|
111
|
+
for (const name of TOOL_GATE_NAMES) {
|
|
112
|
+
const answer = answers[name];
|
|
113
|
+
if (answer?.type === "choice") {
|
|
114
|
+
const parsed = parseToolGate(answer.choice);
|
|
115
|
+
if (parsed)
|
|
116
|
+
return parsed;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
export function resolveRecordToolGate(record) {
|
|
122
|
+
const explicit = parseToolGate(record.tool_gate);
|
|
123
|
+
if (explicit)
|
|
124
|
+
return explicit;
|
|
125
|
+
return extractToolGate(record.answers ?? {});
|
|
126
|
+
}
|
|
127
|
+
export function toolGateRefusesApply(gate) {
|
|
128
|
+
return gate === "block" || gate === "ask";
|
|
129
|
+
}
|
|
130
|
+
export function parseConfidenceThreshold(raw) {
|
|
131
|
+
if (raw === undefined || raw === "")
|
|
132
|
+
return DEFAULT_CONFIDENCE_THRESHOLD;
|
|
133
|
+
const value = typeof raw === "number" ? raw : Number(raw);
|
|
134
|
+
if (!Number.isFinite(value) || value < 0 || value > 1) {
|
|
135
|
+
throw new DecideError("--confidence-threshold must be a number between 0 and 1.");
|
|
136
|
+
}
|
|
137
|
+
return value;
|
|
138
|
+
}
|
|
139
|
+
export function primaryChoice(answers) {
|
|
140
|
+
for (const answer of Object.values(answers)) {
|
|
141
|
+
if (answer.type === "choice") {
|
|
142
|
+
return { choice: answer.choice, confidence: answer.confidence };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
for (const answer of Object.values(answers)) {
|
|
146
|
+
if (answer.type === "noul") {
|
|
147
|
+
return { choice: null, confidence: answer.confidence };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return { choice: null, confidence: 0 };
|
|
151
|
+
}
|
|
152
|
+
/** Codila gate: research/write only when confidence >= threshold; otherwise review. */
|
|
153
|
+
export function resolveDestination(choice, confidence, threshold = DEFAULT_CONFIDENCE_THRESHOLD, fork = "action") {
|
|
154
|
+
if (fork === "human") {
|
|
155
|
+
return { destination: "review", gated: true };
|
|
156
|
+
}
|
|
157
|
+
if (choice && isHighConfidenceRoute(choice) && confidence >= threshold) {
|
|
158
|
+
return { destination: choice, gated: false };
|
|
159
|
+
}
|
|
160
|
+
const gated = Boolean(choice && isHighConfidenceRoute(choice) && confidence < threshold);
|
|
161
|
+
return { destination: "review", gated };
|
|
162
|
+
}
|
|
163
|
+
export function resolveSemantics(mode) {
|
|
164
|
+
if (mode === "active") {
|
|
165
|
+
return { semantics: "handoff", status: "queued" };
|
|
166
|
+
}
|
|
167
|
+
return { semantics: "log-only", status: "logged" };
|
|
168
|
+
}
|
|
169
|
+
export function slugId(value) {
|
|
170
|
+
const slug = value
|
|
171
|
+
.trim()
|
|
172
|
+
.toLowerCase()
|
|
173
|
+
.replace(/[^a-z0-9._-]+/g, "-")
|
|
174
|
+
.replace(/^-+|-+$/g, "");
|
|
175
|
+
return slug || "decision";
|
|
176
|
+
}
|
|
177
|
+
export function fileTimestamp(iso) {
|
|
178
|
+
return iso.replace(/[-:]/g, "").replace(/\.\d{3}Z$/, "Z");
|
|
179
|
+
}
|
|
180
|
+
export function summarizeState(state) {
|
|
181
|
+
if (typeof state === "string") {
|
|
182
|
+
return state.length > 160 ? `${state.slice(0, 157)}...` : state;
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
const raw = JSON.stringify(state);
|
|
186
|
+
return raw.length > 160 ? `${raw.slice(0, 157)}...` : raw;
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return "[unserializable state]";
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
export function stateBlob(state) {
|
|
193
|
+
if (typeof state === "string")
|
|
194
|
+
return state.toLowerCase();
|
|
195
|
+
try {
|
|
196
|
+
return JSON.stringify(state).toLowerCase();
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
return String(state).toLowerCase();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function simpleHash(text) {
|
|
203
|
+
let hash = 0;
|
|
204
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
205
|
+
hash = (hash * 31 + text.charCodeAt(i)) >>> 0;
|
|
206
|
+
}
|
|
207
|
+
return hash;
|
|
208
|
+
}
|
|
209
|
+
export function parseStateInput(raw) {
|
|
210
|
+
const trimmed = raw.trim();
|
|
211
|
+
if (!trimmed) {
|
|
212
|
+
throw new DecideError("State is empty. Pass --state or --from.");
|
|
213
|
+
}
|
|
214
|
+
if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
|
|
215
|
+
try {
|
|
216
|
+
return JSON.parse(trimmed);
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
220
|
+
throw new DecideError(`Invalid JSON state: ${message}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return trimmed;
|
|
224
|
+
}
|
|
225
|
+
export function loadState(options) {
|
|
226
|
+
if (options.fromPath && options.state) {
|
|
227
|
+
throw new DecideError("Pass either --state or --from, not both.");
|
|
228
|
+
}
|
|
229
|
+
if (options.fromPath) {
|
|
230
|
+
try {
|
|
231
|
+
return parseStateInput(readFileSync(options.fromPath, "utf-8"));
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
if (err instanceof DecideError)
|
|
235
|
+
throw err;
|
|
236
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
237
|
+
throw new DecideError(`Cannot read state file: ${message}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (options.state !== undefined) {
|
|
241
|
+
return parseStateInput(options.state);
|
|
242
|
+
}
|
|
243
|
+
throw new DecideError("Pass --state '<json>' or --from <path.json>.");
|
|
244
|
+
}
|
|
245
|
+
export function buildQuestions(choices, nouls, scores = []) {
|
|
246
|
+
if (choices.length === 0 && nouls.length === 0 && scores.length === 0) {
|
|
247
|
+
throw new DecideError("Pass --choice, --noul, and/or --score.");
|
|
248
|
+
}
|
|
249
|
+
const questions = {};
|
|
250
|
+
for (const choice of choices) {
|
|
251
|
+
if (questions[choice.name]) {
|
|
252
|
+
throw new DecideError(`Duplicate question name "${choice.name}".`);
|
|
253
|
+
}
|
|
254
|
+
questions[choice.name] = {
|
|
255
|
+
type: "choice",
|
|
256
|
+
instructions: `Pick one value for "${choice.name}".`,
|
|
257
|
+
criteria: Object.fromEntries(choice.options.map((option) => [option, choiceCriterion(option)])),
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
for (const noul of nouls) {
|
|
261
|
+
if (questions[noul.name]) {
|
|
262
|
+
throw new DecideError(`Duplicate question name "${noul.name}".`);
|
|
263
|
+
}
|
|
264
|
+
questions[noul.name] = {
|
|
265
|
+
type: "noul",
|
|
266
|
+
instructions: `How true is "${noul.name}"? 0 = false, 1 = true.`,
|
|
267
|
+
criteria: {
|
|
268
|
+
true: `The statement ${noul.name} is true given the state.`,
|
|
269
|
+
false: `The statement ${noul.name} is false given the state.`,
|
|
270
|
+
},
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
for (const score of scores) {
|
|
274
|
+
if (questions[score.name]) {
|
|
275
|
+
throw new DecideError(`Duplicate question name "${score.name}".`);
|
|
276
|
+
}
|
|
277
|
+
questions[score.name] = {
|
|
278
|
+
type: "score",
|
|
279
|
+
instructions: `Score "${score.name}" from ${score.min} to ${score.max}.`,
|
|
280
|
+
min: score.min,
|
|
281
|
+
max: score.max,
|
|
282
|
+
criteria: {
|
|
283
|
+
low: `Low ${score.name} near ${score.min}.`,
|
|
284
|
+
high: `High ${score.name} near ${score.max}.`,
|
|
285
|
+
},
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
return questions;
|
|
289
|
+
}
|
|
290
|
+
const REVIEW_RE = /\b(review|human|risk|uncertain|unknown|blocked|escalate|fail|error|warn)\b/i;
|
|
291
|
+
const CLEAR_RE = /\b(ok|pass|clear|ready|done|safe|ignore)\b/i;
|
|
292
|
+
export function stubChoice(name, options, state) {
|
|
293
|
+
const text = stateBlob(state);
|
|
294
|
+
const hits = options.filter((option) => text.includes(option.toLowerCase()));
|
|
295
|
+
if (hits.length === 1) {
|
|
296
|
+
return {
|
|
297
|
+
type: "choice",
|
|
298
|
+
choice: hits[0],
|
|
299
|
+
confidence: 0.78,
|
|
300
|
+
rationale: `State mentions "${hits[0]}".`,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
if (hits.length > 1) {
|
|
304
|
+
const best = hits.reduce((a, b) => (a.length >= b.length ? a : b));
|
|
305
|
+
return {
|
|
306
|
+
type: "choice",
|
|
307
|
+
choice: best,
|
|
308
|
+
confidence: 0.7,
|
|
309
|
+
rationale: `State mentions multiple options; picked "${best}".`,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
const index = simpleHash(`${text}\0${name}`) % options.length;
|
|
313
|
+
return {
|
|
314
|
+
type: "choice",
|
|
315
|
+
choice: options[index],
|
|
316
|
+
confidence: 0.55,
|
|
317
|
+
rationale: "No option keyword in state; deterministic stub pick.",
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
export function stubNoul(_name, state) {
|
|
321
|
+
const text = stateBlob(state);
|
|
322
|
+
const high = REVIEW_RE.test(text);
|
|
323
|
+
const low = CLEAR_RE.test(text);
|
|
324
|
+
if (high && !low) {
|
|
325
|
+
return {
|
|
326
|
+
type: "noul",
|
|
327
|
+
noul: 0.82,
|
|
328
|
+
confidence: 0.76,
|
|
329
|
+
rationale: "State has review/risk language.",
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
if (low && !high) {
|
|
333
|
+
return {
|
|
334
|
+
type: "noul",
|
|
335
|
+
noul: 0.18,
|
|
336
|
+
confidence: 0.74,
|
|
337
|
+
rationale: "State looks clear/ok.",
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
if (high && low) {
|
|
341
|
+
return {
|
|
342
|
+
type: "noul",
|
|
343
|
+
noul: 0.5,
|
|
344
|
+
confidence: 0.6,
|
|
345
|
+
rationale: "Mixed signals.",
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
return {
|
|
349
|
+
type: "noul",
|
|
350
|
+
noul: 0.45,
|
|
351
|
+
confidence: 0.52,
|
|
352
|
+
rationale: "Neutral stub noul.",
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
export function stubScore(name, min, max, state) {
|
|
356
|
+
const noul = stubNoul(name, state);
|
|
357
|
+
const score = min + noul.noul * (max - min);
|
|
358
|
+
return {
|
|
359
|
+
type: "score",
|
|
360
|
+
score: Number(score.toFixed(4)),
|
|
361
|
+
confidence: noul.confidence,
|
|
362
|
+
rationale: noul.rationale.replace("noul", "score").replace("Noul", "Score"),
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
export function stubAnswers(questions, state) {
|
|
366
|
+
const answers = {};
|
|
367
|
+
for (const [name, question] of Object.entries(questions)) {
|
|
368
|
+
if (question.type === "choice") {
|
|
369
|
+
answers[name] = stubChoice(name, Object.keys(question.criteria), state);
|
|
370
|
+
}
|
|
371
|
+
else if (question.type === "noul") {
|
|
372
|
+
answers[name] = stubNoul(name, state);
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
answers[name] = stubScore(name, question.min ?? 0, question.max ?? 1, state);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
return answers;
|
|
379
|
+
}
|
|
380
|
+
function fromJevAnswers(raw) {
|
|
381
|
+
const answers = {};
|
|
382
|
+
for (const [name, answer] of Object.entries(raw)) {
|
|
383
|
+
if (answer.type === "choice") {
|
|
384
|
+
answers[name] = {
|
|
385
|
+
type: "choice",
|
|
386
|
+
choice: answer.choice,
|
|
387
|
+
confidence: answer.confidence,
|
|
388
|
+
rationale: `Jev Choice=${answer.choice}.`,
|
|
389
|
+
probabilities: answer.probabilities,
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
else if (answer.type === "noul") {
|
|
393
|
+
answers[name] = {
|
|
394
|
+
type: "noul",
|
|
395
|
+
noul: answer.noul,
|
|
396
|
+
confidence: answer.confidence,
|
|
397
|
+
rationale: `Jev noul=${answer.noul.toFixed(2)}.`,
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
answers[name] = {
|
|
402
|
+
type: "score",
|
|
403
|
+
score: answer.score,
|
|
404
|
+
confidence: answer.confidence,
|
|
405
|
+
rationale: `Jev score=${answer.score.toFixed(2)}.`,
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
return answers;
|
|
410
|
+
}
|
|
411
|
+
export function isInsideContext(cwd, targetPath) {
|
|
412
|
+
const root = resolve(cwd, ".context");
|
|
413
|
+
const resolved = resolve(targetPath);
|
|
414
|
+
return resolved === root || resolved.startsWith(root + sep);
|
|
415
|
+
}
|
|
416
|
+
export function decisionOutputPath(cwd, generatedAt, id, destination) {
|
|
417
|
+
const file = `${fileTimestamp(generatedAt)}-${slugId(id)}.json`;
|
|
418
|
+
const outPath = destination
|
|
419
|
+
? resolve(cwd, DECISIONS_DIR, destination, file)
|
|
420
|
+
: resolve(cwd, DECISIONS_DIR, file);
|
|
421
|
+
if (!isInsideContext(cwd, outPath)) {
|
|
422
|
+
throw new DecideError("decide writes only under .context/");
|
|
423
|
+
}
|
|
424
|
+
return outPath;
|
|
425
|
+
}
|
|
426
|
+
export function defaultDecisionId(choices, nouls, scores = []) {
|
|
427
|
+
return choices[0]?.name ?? nouls[0]?.name ?? scores[0]?.name ?? "decision";
|
|
428
|
+
}
|
|
429
|
+
export function listPrimitives(questions) {
|
|
430
|
+
const seen = new Set();
|
|
431
|
+
for (const question of Object.values(questions)) {
|
|
432
|
+
seen.add(question.type);
|
|
433
|
+
}
|
|
434
|
+
return [...seen];
|
|
435
|
+
}
|
|
436
|
+
export function choiceOptionCount(questions) {
|
|
437
|
+
for (const question of Object.values(questions)) {
|
|
438
|
+
if (question.type === "choice") {
|
|
439
|
+
return Object.keys(question.criteria).length;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return 0;
|
|
443
|
+
}
|
|
444
|
+
export function resolveDecideMode(options) {
|
|
445
|
+
if (options.dryRun) {
|
|
446
|
+
return { useLive: false, mode: "dry-run" };
|
|
447
|
+
}
|
|
448
|
+
if (options.shadow) {
|
|
449
|
+
return { useLive: Boolean(options.apiKey), mode: "shadow" };
|
|
450
|
+
}
|
|
451
|
+
if (options.apiKey) {
|
|
452
|
+
return { useLive: true, mode: "active" };
|
|
453
|
+
}
|
|
454
|
+
return { useLive: false, mode: "shadow" };
|
|
455
|
+
}
|
|
456
|
+
export function prettyDecideJson(value) {
|
|
457
|
+
return `${JSON.stringify(value, null, 2)}\n`;
|
|
458
|
+
}
|
|
459
|
+
export function decisionsReadmeStub() {
|
|
460
|
+
return `# Decisions
|
|
461
|
+
|
|
462
|
+
Generic Choice/Noul (optional Score) handoff records from \`tocket decide\`.
|
|
463
|
+
|
|
464
|
+
This is Tocket's file-handoff cousin of Codila's \`chief.py\` queues
|
|
465
|
+
(https://x.com/0xCodila/status/2100984487802708306). LLMs create, agents act,
|
|
466
|
+
Jev decides the next move. The CLI writes a JSON the worker reads later.
|
|
467
|
+
Tocket does not run the workers, write prose, do math, or execute.
|
|
468
|
+
|
|
469
|
+
\`decide\` is generic (any state). \`tocket suite triage\` is suite-specific
|
|
470
|
+
(last-run failures). Suite loop still calls triage, not decide.
|
|
471
|
+
|
|
472
|
+
Writes stay under \`.context/decisions/\` (optional \`research|write|review\`
|
|
473
|
+
subfolder when the Choice maps cleanly). No app hooks, no runtime pollution.
|
|
474
|
+
|
|
475
|
+
| File | Purpose |
|
|
476
|
+
| --- | --- |
|
|
477
|
+
| \`<destination>/<timestamp>-<id>.json\` | Handoff record (\`schema\`: \`${DECIDE_SCHEMA}\`) |
|
|
478
|
+
| \`<destination>/<timestamp>-<id>.applied.json\` | Receipt from \`tocket work --apply\` |
|
|
479
|
+
|
|
480
|
+
\`tocket work\` is the first-party consumer (plan by default; never calls Jev).
|
|
481
|
+
|
|
482
|
+
Research/write route only when confidence >= ${DEFAULT_CONFIDENCE_THRESHOLD}
|
|
483
|
+
(configurable). Below that, \`destination\` is \`review\` (\`gated: true\`).
|
|
484
|
+
|
|
485
|
+
A \`tool_gate\` / \`action_gate\` Choice (\`allow|block|ask\`) is the file-first
|
|
486
|
+
tool-risk gate. \`tocket work --apply\` refuses \`block\` and \`ask\` unless \`--force\`.
|
|
487
|
+
Jev (or the stub) is the judge; workers execute; Tocket does not run tools.
|
|
488
|
+
|
|
489
|
+
Bounded forks: \`--fork agent|model|tool|action|human\`. \`human\` always reviews.
|
|
490
|
+
\`--fork model\` is the cheap model-router hook (no extra UX in this release).
|
|
491
|
+
Questions batch into one System One request. Loop: State → Questions → Action (this file) → Verify (consumer).
|
|
492
|
+
|
|
493
|
+
\`--dry-run\` uses the deterministic stub. \`--shadow\` may call Jev when
|
|
494
|
+
\`TYPESAFE_API_KEY\` is set but marks \`semantics: log-only\` (does not claim execution).
|
|
495
|
+
`;
|
|
496
|
+
}
|
|
497
|
+
export function parseDecideRecord(raw) {
|
|
498
|
+
const value = JSON.parse(raw);
|
|
499
|
+
if (!isRecord(value) || value.schema !== DECIDE_SCHEMA) {
|
|
500
|
+
throw new DecideError(`Invalid decision record (expected ${DECIDE_SCHEMA})`);
|
|
501
|
+
}
|
|
502
|
+
const record = value;
|
|
503
|
+
record.tool_gate = resolveRecordToolGate(record);
|
|
504
|
+
return record;
|
|
505
|
+
}
|
|
506
|
+
export function formatDecideSummary(record, relPath) {
|
|
507
|
+
const bits = [];
|
|
508
|
+
for (const [name, answer] of Object.entries(record.answers)) {
|
|
509
|
+
if (answer.type === "choice") {
|
|
510
|
+
bits.push(`${name}=${answer.choice} (${answer.confidence.toFixed(2)})`);
|
|
511
|
+
}
|
|
512
|
+
else if (answer.type === "noul") {
|
|
513
|
+
bits.push(`${name}=${answer.noul.toFixed(2)}`);
|
|
514
|
+
}
|
|
515
|
+
else {
|
|
516
|
+
bits.push(`${name}=${answer.score.toFixed(2)}`);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
const gate = record.gated ? "gated" : "route";
|
|
520
|
+
const toolGate = record.tool_gate ? ` tool_gate=${record.tool_gate}` : "";
|
|
521
|
+
return `decide ${bits.join(" ")} dest=${record.destination} ${gate}${toolGate} source=${record.source} mode=${record.mode} ${relPath}`;
|
|
522
|
+
}
|
|
523
|
+
function ensureDecisionsDir(cwd) {
|
|
524
|
+
const dir = resolve(cwd, DECISIONS_DIR);
|
|
525
|
+
if (!isInsideContext(cwd, dir)) {
|
|
526
|
+
throw new DecideError("decide writes only under .context/");
|
|
527
|
+
}
|
|
528
|
+
mkdirSync(dir, { recursive: true });
|
|
529
|
+
const readmePath = resolve(dir, DECISIONS_README);
|
|
530
|
+
if (!existsSync(readmePath)) {
|
|
531
|
+
writeFileSync(readmePath, decisionsReadmeStub(), "utf-8");
|
|
532
|
+
}
|
|
533
|
+
return dir;
|
|
534
|
+
}
|
|
535
|
+
export async function runDecide(options) {
|
|
536
|
+
const choices = (options.choices ?? []).map(parseChoiceSpec);
|
|
537
|
+
const nouls = (options.nouls ?? []).map(parseNoulSpec);
|
|
538
|
+
const scores = (options.scores ?? []).map(parseScoreSpec);
|
|
539
|
+
const fork = parseFork(options.fork);
|
|
540
|
+
const questions = buildQuestions(choices, nouls, scores);
|
|
541
|
+
const state = loadState({ state: options.state, fromPath: options.fromPath });
|
|
542
|
+
const generatedAt = options.now ? options.now() : new Date().toISOString();
|
|
543
|
+
const id = slugId(options.id ?? defaultDecisionId(choices, nouls, scores));
|
|
544
|
+
const dryRun = options.dryRun === true;
|
|
545
|
+
const threshold = parseConfidenceThreshold(options.confidenceThreshold);
|
|
546
|
+
const apiKey = dryRun
|
|
547
|
+
? undefined
|
|
548
|
+
: options.apiKey === null
|
|
549
|
+
? undefined
|
|
550
|
+
: options.apiKey ?? readTypesafeApiKey();
|
|
551
|
+
const { useLive, mode } = resolveDecideMode({
|
|
552
|
+
dryRun,
|
|
553
|
+
shadow: options.shadow === true,
|
|
554
|
+
apiKey,
|
|
555
|
+
});
|
|
556
|
+
const { semantics, status } = resolveSemantics(mode);
|
|
557
|
+
let source = "stub";
|
|
558
|
+
let model = STUB_MODEL;
|
|
559
|
+
let answers = stubAnswers(questions, state);
|
|
560
|
+
if (useLive && apiKey) {
|
|
561
|
+
try {
|
|
562
|
+
const live = await askJev({
|
|
563
|
+
apiKey,
|
|
564
|
+
state,
|
|
565
|
+
questions,
|
|
566
|
+
fetchImpl: options.fetchImpl,
|
|
567
|
+
});
|
|
568
|
+
answers = fromJevAnswers(live.answers);
|
|
569
|
+
source = "jev";
|
|
570
|
+
model = live.model || JEV_MODEL;
|
|
571
|
+
}
|
|
572
|
+
catch {
|
|
573
|
+
answers = stubAnswers(questions, state);
|
|
574
|
+
source = "stub";
|
|
575
|
+
model = STUB_MODEL;
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
const primary = primaryChoice(answers);
|
|
579
|
+
const { destination, gated } = resolveDestination(primary.choice, primary.confidence, threshold, fork);
|
|
580
|
+
const optionCount = choiceOptionCount(questions);
|
|
581
|
+
const record = {
|
|
582
|
+
schema: DECIDE_SCHEMA,
|
|
583
|
+
id,
|
|
584
|
+
generated_at: generatedAt,
|
|
585
|
+
mode,
|
|
586
|
+
source,
|
|
587
|
+
model,
|
|
588
|
+
choice: primary.choice,
|
|
589
|
+
confidence: primary.confidence,
|
|
590
|
+
destination,
|
|
591
|
+
gated,
|
|
592
|
+
tool_gate: extractToolGate(answers),
|
|
593
|
+
confidence_threshold: threshold,
|
|
594
|
+
semantics,
|
|
595
|
+
status,
|
|
596
|
+
executes: false,
|
|
597
|
+
loop: DECIDE_LOOP,
|
|
598
|
+
fork,
|
|
599
|
+
primitives: listPrimitives(questions),
|
|
600
|
+
batched: Object.keys(questions).length > 1,
|
|
601
|
+
rank_wide: optionCount >= RANK_WIDE_MIN,
|
|
602
|
+
narrow: primary.choice,
|
|
603
|
+
state_summary: summarizeState(state),
|
|
604
|
+
state,
|
|
605
|
+
questions,
|
|
606
|
+
answers,
|
|
607
|
+
};
|
|
608
|
+
const outPath = decisionOutputPath(options.cwd, generatedAt, id, destination);
|
|
609
|
+
ensureDecisionsDir(options.cwd);
|
|
610
|
+
mkdirSync(dirname(outPath), { recursive: true });
|
|
611
|
+
writeFileSync(outPath, prettyDecideJson(record), "utf-8");
|
|
612
|
+
return { record, outPath };
|
|
613
|
+
}
|
|
614
|
+
//# sourceMappingURL=decide.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decide.js","sourceRoot":"","sources":["../../src/utils/decide.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/git.js
CHANGED
|
@@ -101,7 +101,14 @@ export function getCurrentBranch(cwd = process.cwd()) {
|
|
|
101
101
|
if (!isGitRepo(cwd))
|
|
102
102
|
return "";
|
|
103
103
|
try {
|
|
104
|
-
|
|
104
|
+
const current = execSync("git branch --show-current", {
|
|
105
|
+
cwd,
|
|
106
|
+
encoding: "utf-8",
|
|
107
|
+
}).trim();
|
|
108
|
+
if (current)
|
|
109
|
+
return current;
|
|
110
|
+
// Detached HEAD (GitHub Actions pull_request checkouts).
|
|
111
|
+
return execSync("git rev-parse --abbrev-ref HEAD", {
|
|
105
112
|
cwd,
|
|
106
113
|
encoding: "utf-8",
|
|
107
114
|
}).trim();
|