@mgiles/perk 3.1.0 → 3.3.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 +5 -0
- package/extension/authoring/gist/draft.ts +198 -0
- package/extension/authoring/gist/prose.ts +46 -0
- package/extension/authoring/gist/review.ts +133 -0
- package/extension/authoring/gist/save.ts +118 -0
- package/extension/authoring/objective/draft.ts +345 -0
- package/extension/{factories/objectiveDreamReport.ts → authoring/objective/dreamReportGate.ts} +74 -131
- package/extension/authoring/objective/planning.ts +124 -0
- package/extension/authoring/objective/prose.ts +103 -0
- package/extension/authoring/objective/review.ts +128 -0
- package/extension/authoring/objective/save.ts +224 -0
- package/extension/authoring/plan/draft.ts +84 -0
- package/extension/authoring/plan/prose.ts +41 -0
- package/extension/authoring/plan/review.ts +269 -0
- package/extension/authoring/plan/save.ts +256 -0
- package/extension/authoring/plan/source.ts +82 -0
- package/extension/authoring/refinement/context.ts +468 -0
- package/extension/authoring/refinement/draft.ts +261 -0
- package/extension/authoring/refinement/prose.ts +79 -0
- package/extension/authoring/refinement/review.ts +111 -0
- package/extension/authoring/refinement/save.ts +119 -0
- package/extension/authoring/review/approvalGate.ts +34 -0
- package/extension/authoring/review/draftContext.ts +68 -0
- package/extension/codeReview/automated.ts +352 -0
- package/extension/codeReview/submission.ts +229 -0
- package/extension/delivery/address.ts +295 -0
- package/extension/delivery/ci.ts +355 -0
- package/extension/delivery/commitCompact.ts +93 -0
- package/extension/delivery/conflictResolution.ts +247 -0
- package/extension/delivery/ready.ts +193 -0
- package/extension/delivery/stackConflict.ts +361 -0
- package/extension/delivery/stackObjective.ts +16 -0
- package/extension/delivery/stackReconcile.ts +165 -0
- package/extension/delivery/submit.ts +171 -0
- package/extension/index.ts +369 -359
- package/extension/learning/analystWave.ts +324 -0
- package/extension/learning/audit.ts +667 -0
- package/extension/learning/capture.ts +92 -0
- package/extension/learning/containment.ts +104 -0
- package/extension/{waves/dreamWave.ts → learning/dream.ts} +112 -94
- package/extension/learning/dreamAnalysis.ts +435 -0
- package/extension/{waves/dreamReducerWave.ts → learning/dreamReducer.ts} +46 -41
- package/extension/{waves → learning}/dreamReport.ts +35 -31
- package/extension/learning/harvest.ts +491 -0
- package/extension/learning/prose.ts +66 -0
- package/extension/learning/routing.ts +79 -0
- package/extension/pi/v1/bashScanTimeout.ts +64 -0
- package/extension/{doors/prReview.ts → pi/v1/codeReview/automated.ts} +215 -310
- package/extension/{doors/prReviewBrowser.ts → pi/v1/codeReview/browser.ts} +125 -57
- package/extension/{doors/hunkHandoff.ts → pi/v1/codeReview/checkout.ts} +12 -8
- package/extension/{doors/reviewWaveTools.ts → pi/v1/codeReview/reviewWave.ts} +169 -116
- package/extension/pi/v1/codeReview/stack.ts +606 -0
- package/extension/pi/v1/codeReview/submit.ts +354 -0
- package/extension/{doors/prReviewTerminal.ts → pi/v1/codeReview/terminal.ts} +32 -27
- package/extension/pi/v1/contextEvidence.ts +80 -0
- package/extension/pi/v1/contextInjection.ts +207 -0
- package/extension/{doors → pi/v1/delivery}/address.ts +163 -265
- package/extension/pi/v1/delivery/ci.ts +570 -0
- package/extension/pi/v1/delivery/commitCompact.ts +201 -0
- package/extension/pi/v1/delivery/conflictResolverEngine.ts +425 -0
- package/extension/{doors → pi/v1/delivery}/land.ts +128 -60
- package/extension/pi/v1/delivery/ready.ts +322 -0
- package/extension/pi/v1/delivery/stackConflictResolver.ts +172 -0
- package/extension/pi/v1/delivery/stackDrive.ts +120 -0
- package/extension/pi/v1/delivery/stackLand.ts +223 -0
- package/extension/pi/v1/delivery/stackRecover.ts +265 -0
- package/extension/pi/v1/delivery/stackStatus.ts +237 -0
- package/extension/pi/v1/delivery/stackSync.ts +658 -0
- package/extension/pi/v1/delivery/submit.ts +389 -0
- package/extension/pi/v1/delivery/submitConflict.ts +186 -0
- package/extension/pi/v1/draftReview.ts +431 -0
- package/extension/{doors → pi/v1}/draftReviewWaveTools.ts +141 -151
- package/extension/pi/v1/gist.ts +794 -0
- package/extension/pi/v1/learning/audit.ts +186 -0
- package/extension/pi/v1/learning/dream.ts +207 -0
- package/extension/{doors/learnFactory.ts → pi/v1/learning/factory.ts} +18 -65
- package/extension/{doors/harvestWaveTools.ts → pi/v1/learning/harvest.ts} +46 -100
- package/extension/pi/v1/learning/learn.ts +585 -0
- package/extension/{doors → pi/v1}/lifecycleGates.ts +14 -59
- package/extension/{factories → pi/v1}/objective.ts +53 -33
- package/extension/pi/v1/objectiveAuthoring.ts +672 -0
- package/extension/pi/v1/objectiveDreamGate.ts +160 -0
- package/extension/pi/v1/objectivePlanning.ts +776 -0
- package/extension/pi/v1/objectiveRefinement.ts +1320 -0
- package/extension/pi/v1/objectiveReview.ts +451 -0
- package/extension/{doors → pi/v1}/objectiveReviewBrowser.ts +259 -172
- package/extension/pi/v1/plan.ts +812 -0
- package/extension/pi/v1/planReview.ts +820 -0
- package/extension/{doors → pi/v1}/planReviewBrowser.ts +228 -152
- package/extension/{doors/annotationPush.ts → pi/v1/providers/annotations.ts} +158 -89
- package/extension/pi/v1/providers/plannotator.ts +487 -0
- package/extension/{doors → pi/v1/providers}/plannotatorHandoff.ts +152 -34
- package/extension/pi/v1/providers/selection.ts +43 -0
- package/extension/{adapters/planAdapterTombell.ts → pi/v1/providers/tombell.ts} +43 -72
- package/extension/pi/v1/review.ts +538 -0
- package/extension/pi/v1/reviewOutcome.ts +9 -0
- package/extension/pi/v1/scoutWave.ts +318 -0
- package/extension/{doors → pi/v1}/selfcheck.ts +4 -4
- package/extension/session/branchWorkflowSession.ts +60 -0
- package/extension/session/lifecycle.ts +644 -0
- package/extension/session/lifecycleGates.ts +64 -0
- package/extension/session/saveDestination.ts +87 -0
- package/extension/session/workflowSession.ts +971 -0
- package/extension/substrate/agentScratch.ts +27 -54
- package/extension/substrate/bashScanTimeout.ts +181 -0
- package/extension/substrate/bindingDelivery.ts +38 -30
- package/extension/substrate/bindings.ts +4 -5
- package/extension/substrate/cache.ts +64 -12
- package/extension/substrate/childRestrictions.ts +39 -0
- package/extension/substrate/coldDoor.ts +17 -1
- package/extension/substrate/config.ts +157 -19
- package/extension/substrate/git.ts +88 -6
- package/extension/substrate/modelVisible.ts +53 -0
- package/extension/substrate/paths.ts +2 -7
- package/extension/substrate/prompts.ts +22 -0
- package/extension/substrate/registry.ts +2 -0
- package/extension/substrate/resolverLease.ts +364 -0
- package/extension/substrate/sessionData.ts +85 -152
- package/extension/substrate/toolGating.ts +279 -84
- package/extension/substrate/unifiedDiff.ts +1 -1
- package/extension/substrate/workflowState.ts +191 -166
- package/extension/substrate/worktreeResolverLock.ts +261 -0
- package/extension/surfaces/surfaces.ts +79 -27
- package/extension/waves/adversarialReviewWave.ts +103 -48
- package/extension/waves/blockedReports.ts +59 -0
- package/extension/waves/draftReviewWave.ts +42 -42
- package/extension/waves/laneIdentity.ts +77 -0
- package/extension/waves/objectiveExplorerWave.ts +24 -24
- package/extension/waves/prReviewWave.ts +89 -77
- package/extension/waves/reportWave.ts +438 -578
- package/extension/waves/reviewClassifierWave.ts +22 -22
- package/extension/waves/rpcAdapter.ts +100 -15
- package/extension/waves/scoutWave.ts +192 -0
- package/extension/waves/transport.ts +480 -0
- package/extension/worker/sdkAdapter.ts +494 -0
- package/extension/worker/stageExecution.ts +679 -0
- package/extension/workerMain.ts +18 -19
- package/package.json +6 -4
- package/prompts/_fixtures/live.yaml +98 -10
- package/prompts/contexts/adapters/plannotator-gist.md +6 -0
- package/prompts/contexts/adapters/plannotator-objective.md +6 -0
- package/prompts/contexts/adapters/plannotator-plan.md +8 -1
- package/prompts/contexts/adapters/plannotator-refinement.md +22 -0
- package/prompts/contexts/adapters/tombell-plan.md +4 -0
- package/prompts/contexts/objective-refinement.md +17 -0
- package/prompts/contexts/plan-authoring.md +6 -5
- package/prompts/contexts/read-only.md +1 -1
- package/prompts/stages/conflict-resolution-continuation.md +9 -0
- package/prompts/stages/conflict-resolution.md +4 -4
- package/prompts/stages/objective-author/adopt.md +1 -1
- package/prompts/stages/objective-author/file.md +1 -1
- package/prompts/stages/objective-author/seed.md +1 -1
- package/prompts/stages/objective-plan/guidance.md +2 -2
- package/prompts/stages/objective-plan/seed.md +9 -1
- package/prompts/stages/objective-reconcile-ready.md +7 -0
- package/prompts/stages/objective-reconcile.md +1 -1
- package/prompts/stages/objective-refine/seed.md +18 -0
- package/prompts/stages/objective-review-browser.md +4 -4
- package/prompts/stages/objective-sync.md +1 -1
- package/prompts/stages/plan-review-browser.md +4 -4
- package/prompts/stages/pr-review-browser/active.md +3 -4
- package/prompts/stages/pr-review-browser/foreign.md +3 -4
- package/prompts/stages/pr-review-terminal/active.md +3 -3
- package/prompts/stages/pr-review-terminal/foreign.md +3 -3
- package/prompts/stages/pr-review.md +3 -3
- package/prompts/stages/stack-review/cold.md +1 -0
- package/prompts/stages/stack-review-browser/stack.md +22 -0
- package/shared/README.md +8 -3
- package/shared/bindings.yaml +6 -3
- package/shared/contracts.md +4499 -2147
- package/shared/fixtures/issues-table.json +130 -0
- package/shared/registry.yaml +29 -1
- package/shared/schemas/outputs/objective-node-engagement.schema.json +318 -0
- package/shared/schemas/outputs/objective-stack-status.schema.json +178 -2
- package/shared/schemas/outputs/pr-ready.schema.json +110 -2
- package/shared/schemas/outputs/pr-review-context.schema.json +54 -9
- package/shared/schemas/outputs/pr-review-stack-context.schema.json +196 -0
- package/extension/adapters/planAdapterPlannotator.ts +0 -362
- package/extension/doors/auditWaveTools.ts +0 -352
- package/extension/doors/ciExecutor.ts +0 -756
- package/extension/doors/commitCompact.ts +0 -251
- package/extension/doors/dreamWaveTools.ts +0 -475
- package/extension/doors/learn.ts +0 -655
- package/extension/doors/objectiveStack.ts +0 -1143
- package/extension/doors/prReviewDynamic.ts +0 -276
- package/extension/doors/ready.ts +0 -87
- package/extension/doors/submit.ts +0 -347
- package/extension/doors/submitPrReview.ts +0 -408
- package/extension/factories/gistAuthor.ts +0 -94
- package/extension/factories/gistDraft.ts +0 -265
- package/extension/factories/gistSave.ts +0 -251
- package/extension/factories/implementHere.ts +0 -116
- package/extension/factories/objectiveAuthor.ts +0 -98
- package/extension/factories/objectiveDraft.ts +0 -466
- package/extension/factories/objectivePlan.ts +0 -975
- package/extension/factories/objectiveSave.ts +0 -363
- package/extension/factories/planDraft.ts +0 -140
- package/extension/factories/planMode.ts +0 -205
- package/extension/factories/planReview.ts +0 -1237
- package/extension/factories/planSave.ts +0 -604
- package/extension/factories/planTitle.ts +0 -141
- package/extension/substrate/structuredOutput.ts +0 -202
- package/extension/waves/auditWave.ts +0 -312
- package/extension/waves/harvestWave.ts +0 -399
- package/extension/waves/learnWave.ts +0 -155
- package/extension/waves/memoryAdapter.ts +0 -139
- package/extension/waves/prReviewDynamicWave.ts +0 -777
- package/extension/worker/readOnlySession.ts +0 -294
- package/extension/worker/worker.ts +0 -899
- package/prompts/stages/pr-review-dynamic.md +0 -7
- package/shared/contracts-history.md +0 -605
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// The production `DreamGateRecovery` capability for the §8.63 `dream_report` gate — the
|
|
2
|
+
// Pi/session edge that mints the resolver's trusted-context recovery per operation. The
|
|
3
|
+
// mechanics live HERE (workflow-state snapshot, run-scratch reads, the decode/digest ladder,
|
|
4
|
+
// the §8.65 bracket) so `authoring/objective/dreamReportGate.ts` stays storage-free; the gate
|
|
5
|
+
// matrix, outcome union, and every rendered byte stay with the resolver.
|
|
6
|
+
//
|
|
7
|
+
// Fail-closed hardenings at this edge (both classify as `unreadable` → the resolver's
|
|
8
|
+
// `bad_state`, never a silent "non-dream"): the claimed run_id is narrowed through
|
|
9
|
+
// `isSafeRunId` BEFORE any path derivation (the canonical read-path trust boundary — the
|
|
10
|
+
// `activeSessionRunId` degrade-to-null posture is for the identity-optional data seam; the
|
|
11
|
+
// gate refuses loudly on a pathological id), and the `dream_bundle_digest` marker is
|
|
12
|
+
// runtime-narrowed to string-or-absent (the rebuilt state is a cast — a mistyped marker is
|
|
13
|
+
// corrupted state, not "no finalized wave").
|
|
14
|
+
|
|
15
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
16
|
+
import { dirname, join } from "node:path";
|
|
17
|
+
import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
18
|
+
import type { DreamGateRecovery } from "../../authoring/objective/dreamReportGate.ts";
|
|
19
|
+
import { DREAM_MANIFEST_FILENAME, decodeDreamManifest } from "../../learning/dream.ts";
|
|
20
|
+
import {
|
|
21
|
+
DREAM_ANALYSES_FILENAME,
|
|
22
|
+
decodeFinalizedDreamBundle,
|
|
23
|
+
} from "../../learning/dreamReducer.ts";
|
|
24
|
+
import { isSafeRunId, runScratchDir } from "../../substrate/cache.ts";
|
|
25
|
+
import { revalidationBracket } from "../../substrate/git.ts";
|
|
26
|
+
import { digestSessionData } from "../../substrate/sessionData.ts";
|
|
27
|
+
import {
|
|
28
|
+
branchOf,
|
|
29
|
+
rebuildWorkflowState,
|
|
30
|
+
type WorkflowState,
|
|
31
|
+
} from "../../substrate/workflowState.ts";
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Mint the production recovery capability over the live session context. Every `detail` on the
|
|
35
|
+
* `unreadable` arm is the RAW CAUSE (the resolver owns the rendering prefix); `recoverContext`
|
|
36
|
+
* details are the final text, byte-preserved from the recovery ladder this capability carries.
|
|
37
|
+
* `recoverContext` re-executes the full read+decode+digest ladder on EVERY call (the
|
|
38
|
+
* anti-proof-object contract — nothing is cached across calls); `runId` only ever arrives from
|
|
39
|
+
* `readSession()`'s narrowing (the one mint point).
|
|
40
|
+
*/
|
|
41
|
+
export function productionDreamGateRecovery(ctx: ExtensionContext): DreamGateRecovery {
|
|
42
|
+
return {
|
|
43
|
+
readSession() {
|
|
44
|
+
let state: WorkflowState;
|
|
45
|
+
try {
|
|
46
|
+
state = rebuildWorkflowState(branchOf(ctx));
|
|
47
|
+
} catch (error) {
|
|
48
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
49
|
+
return { kind: "unreadable", detail };
|
|
50
|
+
}
|
|
51
|
+
// The rebuilt state is a CAST, not runtime-validated — narrow both fields here.
|
|
52
|
+
const rawRunId: unknown = state.run_id;
|
|
53
|
+
const claimed = typeof rawRunId === "string" && rawRunId.length > 0 ? rawRunId : null;
|
|
54
|
+
if (claimed !== null && !isSafeRunId(claimed)) {
|
|
55
|
+
// Fail-closed BEFORE any path derivation: a pathological claimed id refuses loudly
|
|
56
|
+
// rather than degrading to "non-dream".
|
|
57
|
+
return { kind: "unreadable", detail: "claimed run_id is not a safe path component" };
|
|
58
|
+
}
|
|
59
|
+
const rawMarker: unknown = state.dream_bundle_digest;
|
|
60
|
+
if (rawMarker !== undefined && typeof rawMarker !== "string") {
|
|
61
|
+
// Corrupted state is bad_state, not "no finalized wave" — mapping a mistyped marker
|
|
62
|
+
// to absent would misreport corruption.
|
|
63
|
+
return { kind: "unreadable", detail: "workflow-state dream_bundle_digest is not a string" };
|
|
64
|
+
}
|
|
65
|
+
// The empty string is kept as-is — it is the invalidation residue the recovery ladder
|
|
66
|
+
// already refuses.
|
|
67
|
+
const marker = rawMarker;
|
|
68
|
+
const dream =
|
|
69
|
+
claimed !== null &&
|
|
70
|
+
existsSync(join(runScratchDir(ctx.cwd, claimed), DREAM_MANIFEST_FILENAME));
|
|
71
|
+
return { kind: "read", runId: claimed, dream, marker };
|
|
72
|
+
},
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The trusted-context recovery ladder — every arm fail-closed with a named detail (the
|
|
76
|
+
* resolver maps them to `bad_state`):
|
|
77
|
+
*
|
|
78
|
+
* 1. the run-scoped manifest: read + parse + `decodeDreamManifest` (the strict §8.60
|
|
79
|
+
* decoder, path bound at decode time). No `verifyDocContainment` — this path reads no
|
|
80
|
+
* doc files; the lexical decode suffices (resolved containment is the wave tool's
|
|
81
|
+
* pre-spawn concern);
|
|
82
|
+
* 2. the freshness check: the `dream_bundle_digest` marker (from the resolver's ONE
|
|
83
|
+
* workflow-state snapshot) must be present, non-empty, and equal the digest of the
|
|
84
|
+
* bundle bytes just read — a bare file is never trusted (missing marker = no finalized
|
|
85
|
+
* wave; empty = invalidated by a newer attempt, including a cleanup-failure residue;
|
|
86
|
+
* mismatch = stale/tampered bytes);
|
|
87
|
+
* 3. the strict finalized decode (`decodeFinalizedDreamBundle` over the digest of the
|
|
88
|
+
* manifest bytes just read — the marker authenticates the bundle bytes and the
|
|
89
|
+
* bundle's `manifest_digest` extends that authority to the manifest, so an at-rest
|
|
90
|
+
* manifest edit refuses; the analyses-only mid-wave shape refuses here too).
|
|
91
|
+
*/
|
|
92
|
+
recoverContext(runId, marker) {
|
|
93
|
+
const manifestPath = join(runScratchDir(ctx.cwd, runId), DREAM_MANIFEST_FILENAME);
|
|
94
|
+
let manifestBytes: string;
|
|
95
|
+
let rawManifest: unknown;
|
|
96
|
+
try {
|
|
97
|
+
manifestBytes = readFileSync(manifestPath, "utf8");
|
|
98
|
+
rawManifest = JSON.parse(manifestBytes);
|
|
99
|
+
} catch (error) {
|
|
100
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
101
|
+
return { ok: false, detail: `dream manifest unreadable at '${manifestPath}': ${detail}` };
|
|
102
|
+
}
|
|
103
|
+
const manifest = decodeDreamManifest(rawManifest, manifestPath);
|
|
104
|
+
if (!manifest.ok) {
|
|
105
|
+
return { ok: false, detail: `dream manifest invalid: ${manifest.detail}` };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const bundlePath = join(dirname(manifestPath), DREAM_ANALYSES_FILENAME);
|
|
109
|
+
let bundleBytes: string;
|
|
110
|
+
try {
|
|
111
|
+
bundleBytes = readFileSync(bundlePath, "utf8");
|
|
112
|
+
} catch {
|
|
113
|
+
return {
|
|
114
|
+
ok: false,
|
|
115
|
+
detail: `no dream bundle at '${bundlePath}' — re-run the dream wave`,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
if (marker === undefined || marker === "") {
|
|
119
|
+
return {
|
|
120
|
+
ok: false,
|
|
121
|
+
detail: "no finalized dream wave for this session — re-run the dream wave",
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
if (digestSessionData(bundleBytes) !== marker) {
|
|
125
|
+
return {
|
|
126
|
+
ok: false,
|
|
127
|
+
detail:
|
|
128
|
+
"the dream bundle does not match the session's finalized digest — re-run the dream wave",
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
let rawBundle: unknown;
|
|
132
|
+
try {
|
|
133
|
+
rawBundle = JSON.parse(bundleBytes);
|
|
134
|
+
} catch (error) {
|
|
135
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
136
|
+
return { ok: false, detail: `dream bundle is not valid JSON: ${detail}` };
|
|
137
|
+
}
|
|
138
|
+
const decoded = decodeFinalizedDreamBundle(
|
|
139
|
+
rawBundle,
|
|
140
|
+
manifest.manifest,
|
|
141
|
+
digestSessionData(manifestBytes),
|
|
142
|
+
);
|
|
143
|
+
if (!decoded.ok) {
|
|
144
|
+
return { ok: false, detail: `${decoded.detail} — re-run the dream wave` };
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
ok: true,
|
|
148
|
+
manifest: manifest.manifest,
|
|
149
|
+
analyses: decoded.analyses,
|
|
150
|
+
reducers: decoded.reducers,
|
|
151
|
+
};
|
|
152
|
+
},
|
|
153
|
+
|
|
154
|
+
bracket(expectedSha) {
|
|
155
|
+
// The production §8.65 bracket: END-STATE HEAD + tree-clean against the manifest's
|
|
156
|
+
// stamped commit — fail-closed (an unprovable probe reads as drift).
|
|
157
|
+
return revalidationBracket(ctx.cwd, expectedSha);
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
}
|