@polderlabs/bizar-omp 0.2.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/LICENSE +21 -0
- package/README.md +45 -0
- package/agents/bizar-architect.md +10 -0
- package/agents/bizar-docs.md +10 -0
- package/agents/bizar-implementer.md +10 -0
- package/agents/bizar-planner.md +10 -0
- package/agents/bizar-researcher.md +10 -0
- package/agents/bizar-reviewer.md +10 -0
- package/agents/bizar-security-reviewer.md +10 -0
- package/agents/bizar-verifier.md +10 -0
- package/dist/cli/doctor.d.ts +36 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +15 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/install.d.ts +126 -0
- package/dist/cli/install.d.ts.map +1 -0
- package/dist/cli/install.js +148 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +76 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/migrate.d.ts +19 -0
- package/dist/cli/migrate.d.ts.map +1 -0
- package/dist/cli/migrate.js +14 -0
- package/dist/cli/migrate.js.map +1 -0
- package/dist/cli/run.d.ts +3 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +5 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/core/errors.d.ts +21 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +30 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/evidence.d.ts +6 -0
- package/dist/core/evidence.d.ts.map +1 -0
- package/dist/core/evidence.js +31 -0
- package/dist/core/evidence.js.map +1 -0
- package/dist/core/policies.d.ts +10 -0
- package/dist/core/policies.d.ts.map +1 -0
- package/dist/core/policies.js +41 -0
- package/dist/core/policies.js.map +1 -0
- package/dist/core/recovery.d.ts +7 -0
- package/dist/core/recovery.d.ts.map +1 -0
- package/dist/core/recovery.js +56 -0
- package/dist/core/recovery.js.map +1 -0
- package/dist/core/transitions.d.ts +14 -0
- package/dist/core/transitions.d.ts.map +1 -0
- package/dist/core/transitions.js +59 -0
- package/dist/core/transitions.js.map +1 -0
- package/dist/core/types.d.ts +204 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/extension.d.ts +43 -0
- package/dist/extension.d.ts.map +1 -0
- package/dist/extension.js +199 -0
- package/dist/extension.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/omp/autonomous-settings.d.ts +9 -0
- package/dist/omp/autonomous-settings.d.ts.map +1 -0
- package/dist/omp/autonomous-settings.js +47 -0
- package/dist/omp/autonomous-settings.js.map +1 -0
- package/dist/omp/compatibility.d.ts +22 -0
- package/dist/omp/compatibility.d.ts.map +1 -0
- package/dist/omp/compatibility.js +4 -0
- package/dist/omp/compatibility.js.map +1 -0
- package/dist/omp/completion.d.ts +8 -0
- package/dist/omp/completion.d.ts.map +1 -0
- package/dist/omp/completion.js +14 -0
- package/dist/omp/completion.js.map +1 -0
- package/dist/omp/config.d.ts +11 -0
- package/dist/omp/config.d.ts.map +1 -0
- package/dist/omp/config.js +13 -0
- package/dist/omp/config.js.map +1 -0
- package/dist/omp/context.d.ts +16 -0
- package/dist/omp/context.d.ts.map +1 -0
- package/dist/omp/context.js +3 -0
- package/dist/omp/context.js.map +1 -0
- package/dist/omp/dispatch-admission.d.ts +3 -0
- package/dist/omp/dispatch-admission.d.ts.map +1 -0
- package/dist/omp/dispatch-admission.js +12 -0
- package/dist/omp/dispatch-admission.js.map +1 -0
- package/dist/omp/integration-recovery.d.ts +11 -0
- package/dist/omp/integration-recovery.d.ts.map +1 -0
- package/dist/omp/integration-recovery.js +18 -0
- package/dist/omp/integration-recovery.js.map +1 -0
- package/dist/omp/isolation-policy.d.ts +15 -0
- package/dist/omp/isolation-policy.d.ts.map +1 -0
- package/dist/omp/isolation-policy.js +9 -0
- package/dist/omp/isolation-policy.js.map +1 -0
- package/dist/omp/lifecycle.d.ts +15 -0
- package/dist/omp/lifecycle.d.ts.map +1 -0
- package/dist/omp/lifecycle.js +14 -0
- package/dist/omp/lifecycle.js.map +1 -0
- package/dist/omp/memory.d.ts +17 -0
- package/dist/omp/memory.d.ts.map +1 -0
- package/dist/omp/memory.js +4 -0
- package/dist/omp/memory.js.map +1 -0
- package/dist/omp/model-roles.d.ts +10 -0
- package/dist/omp/model-roles.d.ts.map +1 -0
- package/dist/omp/model-roles.js +5 -0
- package/dist/omp/model-roles.js.map +1 -0
- package/dist/omp/result-reconciliation.d.ts +3 -0
- package/dist/omp/result-reconciliation.d.ts.map +1 -0
- package/dist/omp/result-reconciliation.js +9 -0
- package/dist/omp/result-reconciliation.js.map +1 -0
- package/dist/omp/rpc.d.ts +62 -0
- package/dist/omp/rpc.d.ts.map +1 -0
- package/dist/omp/rpc.js +4 -0
- package/dist/omp/rpc.js.map +1 -0
- package/dist/storage/journal.d.ts +13 -0
- package/dist/storage/journal.d.ts.map +1 -0
- package/dist/storage/journal.js +72 -0
- package/dist/storage/journal.js.map +1 -0
- package/dist/storage/migrations.d.ts +9 -0
- package/dist/storage/migrations.d.ts.map +1 -0
- package/dist/storage/migrations.js +38 -0
- package/dist/storage/migrations.js.map +1 -0
- package/dist/storage/repository-identity.d.ts +12 -0
- package/dist/storage/repository-identity.d.ts.map +1 -0
- package/dist/storage/repository-identity.js +67 -0
- package/dist/storage/repository-identity.js.map +1 -0
- package/dist/tools/evidence.d.ts +9 -0
- package/dist/tools/evidence.d.ts.map +1 -0
- package/dist/tools/evidence.js +9 -0
- package/dist/tools/evidence.js.map +1 -0
- package/dist/tools/integrate.d.ts +13 -0
- package/dist/tools/integrate.d.ts.map +1 -0
- package/dist/tools/integrate.js +106 -0
- package/dist/tools/integrate.js.map +1 -0
- package/dist/tools/result.d.ts +10 -0
- package/dist/tools/result.d.ts.map +1 -0
- package/dist/tools/result.js +2 -0
- package/dist/tools/result.js.map +1 -0
- package/dist/tools/verify.d.ts +14 -0
- package/dist/tools/verify.d.ts.map +1 -0
- package/dist/tools/verify.js +37 -0
- package/dist/tools/verify.js.map +1 -0
- package/dist/tools/workflow.d.ts +9 -0
- package/dist/tools/workflow.d.ts.map +1 -0
- package/dist/tools/workflow.js +65 -0
- package/dist/tools/workflow.js.map +1 -0
- package/dist/workflows/direct.d.ts +10 -0
- package/dist/workflows/direct.d.ts.map +1 -0
- package/dist/workflows/direct.js +2 -0
- package/dist/workflows/direct.js.map +1 -0
- package/dist/workflows/implement.d.ts +3 -0
- package/dist/workflows/implement.d.ts.map +1 -0
- package/dist/workflows/implement.js +4 -0
- package/dist/workflows/implement.js.map +1 -0
- package/dist/workflows/plan.d.ts +18 -0
- package/dist/workflows/plan.d.ts.map +1 -0
- package/dist/workflows/plan.js +6 -0
- package/dist/workflows/plan.js.map +1 -0
- package/dist/workflows/research.d.ts +16 -0
- package/dist/workflows/research.d.ts.map +1 -0
- package/dist/workflows/research.js +2 -0
- package/dist/workflows/research.js.map +1 -0
- package/dist/workflows/review.d.ts +16 -0
- package/dist/workflows/review.d.ts.map +1 -0
- package/dist/workflows/review.js +2 -0
- package/dist/workflows/review.js.map +1 -0
- package/dist/workflows/verify.d.ts +10 -0
- package/dist/workflows/verify.d.ts.map +1 -0
- package/dist/workflows/verify.js +2 -0
- package/dist/workflows/verify.js.map +1 -0
- package/docs/compatibility/baseline.json +8 -0
- package/docs/compatibility/lifecycle-observation.md +5 -0
- package/docs/compatibility/phase-0-report.md +5 -0
- package/docs/compatibility/recovery-report.md +3 -0
- package/docs/compatibility/supported-surfaces.json +7 -0
- package/docs/decisions/native-api-boundary.md +5 -0
- package/docs/evaluations/baseline.md +3 -0
- package/docs/migration/agent-disposition.json +6 -0
- package/docs/migration/final-disposition.json +9 -0
- package/docs/migration/legacy-inventory.json +16 -0
- package/docs/releases/0.2.0.md +9 -0
- package/docs/releases/beta-acceptance.md +3 -0
- package/docs/releases/native-stable.md +3 -0
- package/docs/releases/npm-publishing.md +22 -0
- package/docs/releases/rollback.md +3 -0
- package/docs/releases/support-matrix.md +11 -0
- package/docs/security/qualification.md +3 -0
- package/docs/security/threat-model.md +5 -0
- package/optional/openkan/index.ts +3 -0
- package/package.json +59 -0
- package/prompts/bizar-system.md +3 -0
- package/rules/bizar-core.md +7 -0
- package/rules/bizar-native-omp.md +6 -0
- package/schemas/evidence-record.schema.json +16 -0
- package/schemas/workflow-run.schema.json +16 -0
- package/skills/bizar-architecture/SKILL.md +6 -0
- package/skills/bizar-planning/SKILL.md +6 -0
- package/skills/bizar-research/SKILL.md +6 -0
- package/skills/bizar-review/SKILL.md +6 -0
- package/skills/bizar-security/SKILL.md +6 -0
- package/skills/bizar-testing/SKILL.md +6 -0
- package/skills/bizar-workflow/SKILL.md +6 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { closeSync, existsSync, fsyncSync, mkdirSync, openSync, readFileSync, unlinkSync, writeSync } from "node:fs";
|
|
3
|
+
import { execFileSync } from "node:child_process";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { ContractError, OwnershipError } from "../core/errors.js";
|
|
6
|
+
import { requireFreshEvidence } from "../core/evidence.js";
|
|
7
|
+
import { assertOwner } from "../core/recovery.js";
|
|
8
|
+
import { repositoryIdentity, workingTreeDigest, isDirty } from "../storage/repository-identity.js";
|
|
9
|
+
function inScope(path, scopes) { return scopes.some(scope => path === scope || path.startsWith(`${scope.replace(/\/$/, "")}/`)); }
|
|
10
|
+
function checkedPatchPaths(cwd, patch) {
|
|
11
|
+
let output;
|
|
12
|
+
try {
|
|
13
|
+
output = execFileSync("git", ["apply", "--check", "--numstat", "-z", "--"], { cwd, input: patch, stdio: ["pipe", "pipe", "pipe"] });
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
throw new ContractError("Patch is invalid or cannot be applied cleanly");
|
|
17
|
+
}
|
|
18
|
+
const fields = output.length === 0 ? [] : output.subarray(0, -1).toString("utf8").split("\0");
|
|
19
|
+
const paths = [];
|
|
20
|
+
for (let index = 0; index < fields.length; index += 1) {
|
|
21
|
+
const match = /^(?:\d+|-)\t(?:\d+|-)\t(.*)$/.exec(fields[index]);
|
|
22
|
+
if (!match)
|
|
23
|
+
throw new ContractError("Git returned an unparseable patch path");
|
|
24
|
+
if (match[1])
|
|
25
|
+
paths.push(match[1]);
|
|
26
|
+
else {
|
|
27
|
+
const oldPath = fields[++index];
|
|
28
|
+
const newPath = fields[++index];
|
|
29
|
+
if (oldPath === undefined || newPath === undefined)
|
|
30
|
+
throw new ContractError("Git returned an incomplete rename or copy path");
|
|
31
|
+
paths.push(oldPath, newPath);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (paths.length === 0)
|
|
35
|
+
throw new ContractError("Patch does not change any files");
|
|
36
|
+
for (const path of paths) {
|
|
37
|
+
if (!path || path.startsWith("/") || path.split("/").some(segment => segment === "." || segment === ".."))
|
|
38
|
+
throw new ContractError("Patch contains an unsafe path", { path });
|
|
39
|
+
}
|
|
40
|
+
return [...new Set(paths)];
|
|
41
|
+
}
|
|
42
|
+
export async function integrate(binding, request) {
|
|
43
|
+
let state = binding.journal.snapshot();
|
|
44
|
+
if (!state.run)
|
|
45
|
+
throw new ContractError("Cannot integrate without a run");
|
|
46
|
+
assertOwner(state.run.nativeSessionId, binding.owner);
|
|
47
|
+
const item = state.run.workItems.find(candidate => candidate.id === request.workItemId);
|
|
48
|
+
if (!item)
|
|
49
|
+
throw new ContractError(`Unknown work item: ${request.workItemId}`);
|
|
50
|
+
const patchPaths = checkedPatchPaths(binding.cwd, request.patch);
|
|
51
|
+
if (!patchPaths.every(path => inScope(path, item.scope)))
|
|
52
|
+
throw new ContractError("Patch changes exceed the admitted work-item scope", { changedPaths: patchPaths, scope: item.scope });
|
|
53
|
+
if (request.changedPaths && JSON.stringify([...new Set(request.changedPaths)].sort()) !== JSON.stringify([...patchPaths].sort()))
|
|
54
|
+
throw new ContractError("Declared paths do not match the patch");
|
|
55
|
+
const identity = repositoryIdentity(binding.cwd);
|
|
56
|
+
if (isDirty(binding.cwd))
|
|
57
|
+
throw new ContractError("Target worktree is dirty; integration is blocked until unrelated changes are reconciled");
|
|
58
|
+
const targetDigest = workingTreeDigest(binding.cwd);
|
|
59
|
+
requireFreshEvidence(state.evidence, request.evidenceIds, targetDigest);
|
|
60
|
+
const patchDigest = createHash("sha256").update(request.patch).digest("hex");
|
|
61
|
+
const lockDir = join(identity.gitDir, "bizar", "omp-v1");
|
|
62
|
+
mkdirSync(lockDir, { recursive: true, mode: 0o700 });
|
|
63
|
+
const lockPath = join(lockDir, "integration.lock");
|
|
64
|
+
let fd;
|
|
65
|
+
const lockOwner = randomUUID();
|
|
66
|
+
try {
|
|
67
|
+
try {
|
|
68
|
+
fd = openSync(lockPath, "wx", 0o600);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
throw new OwnershipError("Another run owns the serialized integration path");
|
|
72
|
+
}
|
|
73
|
+
writeSync(fd, lockOwner, undefined, "utf8");
|
|
74
|
+
fsyncSync(fd);
|
|
75
|
+
state = binding.journal.snapshot();
|
|
76
|
+
if (!state.run)
|
|
77
|
+
throw new ContractError("Cannot integrate without a run");
|
|
78
|
+
assertOwner(state.run.nativeSessionId, binding.owner);
|
|
79
|
+
const lockedItem = state.run.workItems.find(candidate => candidate.id === request.workItemId);
|
|
80
|
+
if (!lockedItem || !patchPaths.every(path => inScope(path, lockedItem.scope)))
|
|
81
|
+
throw new ContractError("Work-item scope changed before integration");
|
|
82
|
+
if (isDirty(binding.cwd))
|
|
83
|
+
throw new ContractError("Target worktree is dirty; integration is blocked until unrelated changes are reconciled");
|
|
84
|
+
const lockedDigest = workingTreeDigest(binding.cwd);
|
|
85
|
+
requireFreshEvidence(state.evidence, request.evidenceIds, lockedDigest);
|
|
86
|
+
const attempt = { id: `integration_${randomUUID()}`, runId: state.run.runId, workItemId: lockedItem.id, baseDigest: lockedDigest, patchDigest, changedPaths: patchPaths, eligibleEvidenceIds: request.evidenceIds, lockOwner: binding.owner, outcome: request.apply ? "unknown-outcome" : "eligible", attemptedAt: new Date().toISOString() };
|
|
87
|
+
binding.journal.append({ type: "integration.recorded", runId: attempt.runId, attempt }, `integration-intent:${attempt.id}`, state.revision);
|
|
88
|
+
if (request.apply) {
|
|
89
|
+
await request.apply(request.patch);
|
|
90
|
+
attempt.outcome = "applied";
|
|
91
|
+
attempt.resultingDigest = workingTreeDigest(binding.cwd);
|
|
92
|
+
binding.journal.append({ type: "integration.recorded", runId: attempt.runId, attempt }, `integration-outcome:${attempt.id}`);
|
|
93
|
+
}
|
|
94
|
+
return attempt;
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
if (fd !== undefined)
|
|
98
|
+
closeSync(fd);
|
|
99
|
+
try {
|
|
100
|
+
if (existsSync(lockPath) && readFileSync(lockPath, "utf8") === lockOwner)
|
|
101
|
+
unlinkSync(lockPath);
|
|
102
|
+
}
|
|
103
|
+
catch { /* A replacement lock belongs to another owner. */ }
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=integrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrate.js","sourceRoot":"","sources":["../../src/tools/integrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ToolResult {
|
|
2
|
+
content: Array<{
|
|
3
|
+
type: "text";
|
|
4
|
+
text: string;
|
|
5
|
+
}>;
|
|
6
|
+
details?: Record<string, unknown>;
|
|
7
|
+
isError?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare const result: (value: unknown, isError?: boolean) => ToolResult;
|
|
10
|
+
//# sourceMappingURL=result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/tools/result.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IAAG,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAAE;AACrI,eAAO,MAAM,MAAM,GAAI,OAAO,OAAO,EAAE,iBAAe,KAAG,UAA6P,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export const result = (value, isError = false) => ({ content: [{ type: "text", text: typeof value === "string" ? value : JSON.stringify(value, null, 2) }], details: typeof value === "object" && value !== null ? value : undefined, isError: isError || undefined });
|
|
2
|
+
//# sourceMappingURL=result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/tools/result.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,OAAO,GAAG,KAAK,EAAc,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAgC,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SessionBinding } from "../omp/lifecycle.js";
|
|
2
|
+
export interface CheckResult {
|
|
3
|
+
checkId: string;
|
|
4
|
+
command: string[];
|
|
5
|
+
cwd: string;
|
|
6
|
+
result: "passed" | "failed" | "unknown";
|
|
7
|
+
exitCode: number;
|
|
8
|
+
stdout: string;
|
|
9
|
+
stderr: string;
|
|
10
|
+
targetDigest: string;
|
|
11
|
+
evidenceId: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function runVerification(binding: SessionBinding, checkId: string, command: string[], cwd?: string, signal?: AbortSignal): Promise<CheckResult>;
|
|
14
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/tools/verify.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAK1D,MAAM,WAAW,WAAW;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;CAAE;AAEtN,wBAAsB,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,SAAc,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAsBhK"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { createEvidence } from "../core/evidence.js";
|
|
5
|
+
import { repositoryIdentity, workingTreeDigest } from "../storage/repository-identity.js";
|
|
6
|
+
import { ContractError } from "../core/errors.js";
|
|
7
|
+
const execFileAsync = promisify(execFile);
|
|
8
|
+
const redact = (value) => value.replace(/(authorization|api[-_]?key|token|secret|password)\s*[:=]\s*[^\s,;]+/gi, "$1=[REDACTED]").replace(/Bearer\s+[A-Za-z0-9._-]+/gi, "Bearer [REDACTED]");
|
|
9
|
+
export async function runVerification(binding, checkId, command, cwd = binding.cwd, signal) {
|
|
10
|
+
if (!checkId.trim() || !command.length || command.some(part => typeof part !== "string" || part.includes("\0")) || !command[0].trim())
|
|
11
|
+
throw new ContractError("A check ID and nonempty command argv are required");
|
|
12
|
+
if (repositoryIdentity(cwd).root !== repositoryIdentity(binding.cwd).root)
|
|
13
|
+
throw new ContractError("Verification cwd must be inside the bound worktree");
|
|
14
|
+
signal?.throwIfAborted();
|
|
15
|
+
const run = binding.journal.snapshot().run;
|
|
16
|
+
if (!run)
|
|
17
|
+
throw new ContractError("Start a workflow before recording verification");
|
|
18
|
+
if (run.nativeSessionId !== binding.owner)
|
|
19
|
+
throw new ContractError("Only the run owner may record verification");
|
|
20
|
+
const runId = run.runId;
|
|
21
|
+
const before = workingTreeDigest(cwd);
|
|
22
|
+
try {
|
|
23
|
+
const output = await execFileAsync(command[0], command.slice(1), { cwd, signal, timeout: 10 * 60 * 1000, maxBuffer: 512 * 1024, env: { ...process.env, CI: "1" } });
|
|
24
|
+
const result = workingTreeDigest(cwd) === before ? "passed" : "unknown";
|
|
25
|
+
const base = createEvidence({ id: `evidence_${randomUUID()}`, runId, type: "test", checkId, command, cwd, result, exitCode: result === "passed" ? 0 : undefined, targetDigest: before, inputDigests: {}, stdout: redact(output.stdout.slice(-100_000)), stderr: redact(output.stderr.slice(-100_000)), artifactHashes: [], provenance: { producer: "bizar-omp-host", observedAt: new Date().toISOString() } });
|
|
26
|
+
const evidence = result === "unknown" ? { ...base, staleReason: "verification command changed the target tree" } : base;
|
|
27
|
+
binding.journal.append({ type: "evidence.recorded", runId: evidence.runId, evidence }, `evidence:${evidence.id}`);
|
|
28
|
+
return { checkId, command, cwd, result, exitCode: result === "passed" ? 0 : 1, stdout: evidence.stdout ?? "", stderr: evidence.stderr ?? "", targetDigest: before, evidenceId: evidence.id };
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
const e = error;
|
|
32
|
+
const evidence = createEvidence({ id: `evidence_${randomUUID()}`, runId, type: "test", checkId, command, cwd, result: "failed", exitCode: typeof e.code === "number" ? e.code : 1, targetDigest: before, inputDigests: {}, stdout: e.stdout ? redact(e.stdout.slice(-100_000)) : undefined, stderr: redact(e.stderr?.slice(-100_000) ?? String(error)), artifactHashes: [], provenance: { producer: "bizar-omp-host", observedAt: new Date().toISOString() } });
|
|
33
|
+
binding.journal.append({ type: "evidence.recorded", runId: evidence.runId, evidence }, `evidence:${evidence.id}`);
|
|
34
|
+
return { checkId, command, cwd, result: "failed", exitCode: evidence.exitCode ?? 1, stdout: redact(e.stdout ?? ""), stderr: redact(e.stderr ?? String(error)), targetDigest: before, evidenceId: evidence.id };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/tools/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { WorkItem } from "../core/types.js";
|
|
2
|
+
import type { SessionBinding } from "../omp/lifecycle.js";
|
|
3
|
+
export type WorkflowAction = "start" | "status" | "transition" | "add-work" | "accept-work" | "complete" | "cancel" | "next";
|
|
4
|
+
export declare function runWorkflow(binding: SessionBinding, action: WorkflowAction, params: Record<string, unknown>): WorkItem | import("../core/types.js").WorkflowRun | import("../core/types.js").StateSnapshot | {
|
|
5
|
+
action: "start";
|
|
6
|
+
run: import("../core/types.js").WorkflowRun;
|
|
7
|
+
decision: import("../core/types.js").RouteDecision;
|
|
8
|
+
} | null | undefined;
|
|
9
|
+
//# sourceMappingURL=workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/tools/workflow.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAqB,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE7H,wBAAgB,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;qBAgD3G"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { acceptWorkItem, addWorkItem, completeRun, transition } from "../core/transitions.js";
|
|
2
|
+
import { requireFreshEvidence } from "../core/evidence.js";
|
|
3
|
+
import { classifyRoute } from "../core/policies.js";
|
|
4
|
+
import { ContractError } from "../core/errors.js";
|
|
5
|
+
import { assertOwner } from "../core/recovery.js";
|
|
6
|
+
import { startObjective } from "../omp/lifecycle.js";
|
|
7
|
+
import { workingTreeDigest } from "../storage/repository-identity.js";
|
|
8
|
+
export function runWorkflow(binding, action, params) {
|
|
9
|
+
let state = binding.journal.snapshot();
|
|
10
|
+
if (action === "start") {
|
|
11
|
+
const objective = params.objective;
|
|
12
|
+
const run = startObjective(binding, objective);
|
|
13
|
+
return { action, run, decision: classifyRoute({ text: objective.objective }) };
|
|
14
|
+
}
|
|
15
|
+
if (!state.run)
|
|
16
|
+
throw new ContractError("No workflow run exists; start one first");
|
|
17
|
+
if (action === "status")
|
|
18
|
+
return state;
|
|
19
|
+
if (action !== "next")
|
|
20
|
+
assertOwner(state.run.nativeSessionId, binding.owner);
|
|
21
|
+
if (action === "transition") {
|
|
22
|
+
const to = params.to;
|
|
23
|
+
if (to === "complete")
|
|
24
|
+
throw new ContractError("Use the complete action");
|
|
25
|
+
const result = transition(state.run, to, String(params.reason ?? "operator request"));
|
|
26
|
+
binding.journal.append(result.event, `transition:${state.run.runId}:${state.run.revision}:${to}`, state.revision);
|
|
27
|
+
return result.run;
|
|
28
|
+
}
|
|
29
|
+
if (action === "cancel") {
|
|
30
|
+
const reason = String(params.reason ?? "operator cancellation");
|
|
31
|
+
binding.journal.append({ type: "run.cancelled", runId: state.run.runId, reason }, `cancel:${state.run.runId}:${state.run.revision}`, state.revision);
|
|
32
|
+
return binding.journal.snapshot().run;
|
|
33
|
+
}
|
|
34
|
+
if (action === "add-work") {
|
|
35
|
+
const item = addWorkItem(state.run, params.item);
|
|
36
|
+
const added = item.workItems[item.workItems.length - 1];
|
|
37
|
+
binding.journal.append({ type: "work-item.upserted", runId: item.runId, item: added }, `work:${item.runId}:${added.id}`, state.revision);
|
|
38
|
+
return added;
|
|
39
|
+
}
|
|
40
|
+
if (action === "accept-work") {
|
|
41
|
+
const workItemId = String(params.workItemId ?? "");
|
|
42
|
+
const evidenceIds = params.evidenceIds;
|
|
43
|
+
if (!Array.isArray(evidenceIds))
|
|
44
|
+
throw new ContractError("Evidence IDs are required to accept work");
|
|
45
|
+
requireFreshEvidence(state.evidence, evidenceIds, workingTreeDigest(binding.cwd));
|
|
46
|
+
const next = acceptWorkItem(state.run, workItemId);
|
|
47
|
+
const item = next.workItems.find(candidate => candidate.id === workItemId);
|
|
48
|
+
binding.journal.append({ type: "work-item.upserted", runId: next.runId, item }, `work-accepted:${next.runId}:${item.id}:${item.revision}`, state.revision);
|
|
49
|
+
return item;
|
|
50
|
+
}
|
|
51
|
+
if (action === "complete") {
|
|
52
|
+
if (state.integrations.some(attempt => attempt.outcome === "unknown-outcome") || state.dispatches.some(intent => !["settled", "rejected"].includes(intent.status)))
|
|
53
|
+
throw new ContractError("Unresolved integrations or dispatches block completion");
|
|
54
|
+
const requiredChecks = params.requiredChecks;
|
|
55
|
+
if (!Array.isArray(requiredChecks) || requiredChecks.length === 0)
|
|
56
|
+
throw new ContractError("At least one required check is required for completion");
|
|
57
|
+
const result = completeRun(state.run, requiredChecks, state.evidence, workingTreeDigest(binding.cwd));
|
|
58
|
+
binding.journal.append(result.event, `complete:${state.run.runId}:${state.run.revision}`, state.revision);
|
|
59
|
+
return result.run;
|
|
60
|
+
}
|
|
61
|
+
if (action === "next")
|
|
62
|
+
return state.run.workItems.find(item => item.lifecycle === "pending") ?? null;
|
|
63
|
+
throw new ContractError(`Unknown workflow action: ${action}`);
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/tools/workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ObjectiveContract } from "../core/types.js";
|
|
2
|
+
export declare function directWorkflow(objective: ObjectiveContract): {
|
|
3
|
+
kind: string;
|
|
4
|
+
objective: ObjectiveContract;
|
|
5
|
+
requiresIsolation: boolean;
|
|
6
|
+
apply: string;
|
|
7
|
+
verification: string[];
|
|
8
|
+
bounded: boolean;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=direct.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct.d.ts","sourceRoot":"","sources":["../../src/workflows/direct.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,wBAAgB,cAAc,CAAC,SAAS,EAAE,iBAAiB;;;;;;;EAAoJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct.js","sourceRoot":"","sources":["../../src/workflows/direct.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,cAAc,CAAC,SAA4B,IAAI,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,CAAC,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implement.d.ts","sourceRoot":"","sources":["../../src/workflows/implement.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC3E,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,6CAA4I"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { admitDispatch } from "../omp/dispatch-admission.js";
|
|
2
|
+
import { classifyRoute } from "../core/policies.js";
|
|
3
|
+
export function implementationDispatch(run, item, preset) { return admitDispatch(run, item, classifyRoute({ text: item.title, role: item.role, files: item.scope }), preset, run.nativeSessionId); }
|
|
4
|
+
//# sourceMappingURL=implement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implement.js","sourceRoot":"","sources":["../../src/workflows/implement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,UAAU,sBAAsB,CAAC,GAAgB,EAAE,IAAc,EAAE,MAAmB,IAAI,OAAO,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ObjectiveContract, RouteDecision } from "../core/types.js";
|
|
2
|
+
export interface Plan {
|
|
3
|
+
schemaVersion: 1;
|
|
4
|
+
objective: ObjectiveContract;
|
|
5
|
+
route: RouteDecision;
|
|
6
|
+
workItems: Array<{
|
|
7
|
+
title: string;
|
|
8
|
+
role: string;
|
|
9
|
+
scope: string[];
|
|
10
|
+
acceptanceCriteria: string[];
|
|
11
|
+
verificationPlan: string[];
|
|
12
|
+
}>;
|
|
13
|
+
risks: string[];
|
|
14
|
+
stopConditions: string[];
|
|
15
|
+
readOnly: true;
|
|
16
|
+
}
|
|
17
|
+
export declare function makePlan(objective: ObjectiveContract): Plan;
|
|
18
|
+
//# sourceMappingURL=plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/workflows/plan.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEzE,MAAM,WAAW,IAAI;IAAG,aAAa,EAAE,CAAC,CAAC;IAAC,SAAS,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,kBAAkB,EAAE,MAAM,EAAE,CAAC;QAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAC;CAAE;AAExR,wBAAgB,QAAQ,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAG3D"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { classifyRoute } from "../core/policies.js";
|
|
2
|
+
export function makePlan(objective) {
|
|
3
|
+
const route = classifyRoute({ text: objective.objective, files: [] });
|
|
4
|
+
return { schemaVersion: 1, objective, route, workItems: [{ title: "Orient and define acceptance", role: "bizar-planner", scope: [], acceptanceCriteria: objective.acceptanceCriteria, verificationPlan: objective.verificationPlan }], risks: ["External provider/model behavior remains an observed dependency"], stopConditions: objective.stopConditions, readOnly: true };
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/workflows/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKpD,MAAM,UAAU,QAAQ,CAAC,SAA4B;IACnD,MAAM,KAAK,GAAG,aAAa,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACtE,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,EAAE,kBAAkB,EAAE,SAAS,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,iEAAiE,CAAC,EAAE,cAAc,EAAE,SAAS,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAChX,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { RouteIntent } from "../core/types.js";
|
|
2
|
+
export interface ResearchFinding {
|
|
3
|
+
claim: string;
|
|
4
|
+
kind: "repository-fact" | "external-fact" | "inference" | "unknown";
|
|
5
|
+
source?: string;
|
|
6
|
+
location?: string;
|
|
7
|
+
retrievedAt?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ResearchWorkflow {
|
|
10
|
+
objective: string;
|
|
11
|
+
intent: RouteIntent;
|
|
12
|
+
findings: ResearchFinding[];
|
|
13
|
+
readOnly: true;
|
|
14
|
+
}
|
|
15
|
+
export declare function createResearch(objective: string, findings?: ResearchFinding[]): ResearchWorkflow;
|
|
16
|
+
//# sourceMappingURL=research.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/workflows/research.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,MAAM,WAAW,eAAe;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,iBAAiB,GAAG,eAAe,GAAG,WAAW,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAAE;AAClL,MAAM,WAAW,gBAAgB;IAAG,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAC;CAAE;AAC1H,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,GAAE,eAAe,EAAO,GAAG,gBAAgB,CAAuE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/workflows/research.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,WAA8B,EAAE,IAAsB,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface ReviewFinding {
|
|
2
|
+
id: string;
|
|
3
|
+
targetDigest: string;
|
|
4
|
+
file: string;
|
|
5
|
+
line?: number;
|
|
6
|
+
severity: "low" | "medium" | "high" | "critical";
|
|
7
|
+
scenario: string;
|
|
8
|
+
evidence: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare function reviewContract(targetDigest: string, findings: ReviewFinding[]): {
|
|
11
|
+
targetDigest: string;
|
|
12
|
+
findings: ReviewFinding[];
|
|
13
|
+
staleFindings: ReviewFinding[];
|
|
14
|
+
refutationRequires: string[];
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/workflows/review.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;CAAE;AACzL,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE;;;;;EAA+R"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export function reviewContract(targetDigest, findings) { return { targetDigest, findings: findings.filter(finding => finding.targetDigest === targetDigest), staleFindings: findings.filter(finding => finding.targetDigest !== targetDigest), refutationRequires: ["exact target digest", "full scenario", "reproduction or counter-evidence"] }; }
|
|
2
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/workflows/review.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,cAAc,CAAC,YAAoB,EAAE,QAAyB,IAAI,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,KAAK,YAAY,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,KAAK,YAAY,CAAC,EAAE,kBAAkB,EAAE,CAAC,qBAAqB,EAAE,eAAe,EAAE,kCAAkC,CAAC,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { EvidenceRecord } from "../core/types.js";
|
|
2
|
+
export declare function verificationReceipt(checkId: string, evidence: EvidenceRecord): {
|
|
3
|
+
checkId: string;
|
|
4
|
+
targetDigest: string;
|
|
5
|
+
result: "blocked" | "failed" | "cancelled" | "passed" | "unknown";
|
|
6
|
+
trustedObservation: boolean;
|
|
7
|
+
fresh: boolean;
|
|
8
|
+
artifactHashes: string[];
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/workflows/verify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc;;;;;;;EAA+N"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export function verificationReceipt(checkId, evidence) { return { checkId, targetDigest: evidence.targetDigest, result: evidence.result, trustedObservation: evidence.provenance.producer === "bizar-omp-host", fresh: !evidence.stale, artifactHashes: evidence.artifactHashes }; }
|
|
2
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/workflows/verify.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,QAAwB,IAAI,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,kBAAkB,EAAE,QAAQ,CAAC,UAAU,CAAC,QAAQ,KAAK,gBAAgB,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"researchDate": "2026-09-17",
|
|
4
|
+
"bizarReference": { "repository": "../BizarHarness", "commit": "e13aa131bdcd368548118464f0da1bace302e64b", "role": "reference-only" },
|
|
5
|
+
"omp": { "repository": "https://github.com/can1357/oh-my-pi", "testedVersion": "18.2.2", "testedCommit": "60c9a115b2e8decc0f75825459362d14188a8bc0", "researchedMainCommit": "dbf3afad4894bde827d90f965e77b3fe1c5a95e5", "releaseVersionSeenInResearch": "18.2.4", "releaseCommitSeenInResearch": "1c0303b1f2ec515cbf4b44a9a49d68a029531aac", "qualification": "The runtime version and commit are recorded separately; a displayed version alone is insufficient." },
|
|
6
|
+
"bun": { "minimum": "1.3.14", "probe": "bun --version is required during release qualification" },
|
|
7
|
+
"package": { "name": "@polderlabs/bizar-omp", "version": "0.2.0", "integrity": "computed by npm pack in CI", "extensionEntry": "dist/extension.js" }
|
|
8
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Native lifecycle observation
|
|
2
|
+
|
|
3
|
+
The extension factory only registers handlers. A session binding and journal are created from `session_start`; the binding is detached on session switch and shutdown. A task acknowledgment is recorded as an admission observation, not a settled worker result. Completion requires a terminal observation plus fresh host evidence.
|
|
4
|
+
|
|
5
|
+
OMP task/eval children own their worker/session lifecycle and isolation. Bizar stores the logical dispatch id, expected parent session, native ids when observed, structured result, artifact references, and an explicit `unknown-outcome` status when the boundary cannot prove settlement. The extension does not recreate a worker runtime or a stop-hook loop.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Phase 0 report
|
|
2
|
+
|
|
3
|
+
The package/discovery slice is qualified locally against OMP 18.2.2: `bun scripts/verify-omp-loader.mjs` imports the built extension through the real loader with no errors and observes four tools, one command, and four lifecycle handlers. Deterministic tests cover registration-only loading, session binding, structured state, native-dispatch admission, no-auto-application, evidence freshness, secret-redacted verification, and serialized integration admission.
|
|
4
|
+
|
|
5
|
+
The live provider/task path is intentionally not represented as a passing unit test. A real OMP session is required to qualify native child settlement, model-role resolution, and host isolation on a selected runtime; the support matrix records that boundary.
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
# Recovery qualification
|
|
2
|
+
|
|
3
|
+
The core preserves durable intent and an explicit `unknown-outcome` state. Recovery classification distinguishes clean completion, dirty parent, partial merge, conflict, nested repository, and unknown Git outcomes. Original isolated workers are not revived after OMP cleanup; repair is a new scoped assignment with retained artifacts.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"supported": ["omp extension factory", "native slash command", "native tools", "headless CLI", "JSONL workflow journal", "host-observed verification", "serialized integration admission", "dry-run migration"],
|
|
4
|
+
"qualified": ["OMP 18.2.2 / commit 60c9a115b2e8decc0f75825459362d14188a8bc0", "Node 22 and 24 CI", "Bun 1.3.14 compatibility CI"],
|
|
5
|
+
"not_claimed": ["OS sandboxing", "provider model quality", "automatic application of worker changes", "live task/eval child completion without a host OMP session", "Claude Code/AO compatibility"],
|
|
6
|
+
"native_contract": { "extension_load": "registration-only", "tool_executor": "five arguments", "command_handler": "args and context", "manifest": "omp.extensions" }
|
|
7
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Native API boundary
|
|
2
|
+
|
|
3
|
+
The public boundary is the OMP extension factory, `registerTool`, `registerCommand`, lifecycle events, and the `omp.extensions` package manifest. The core imports none of those surfaces. The host owns provider/auth, native task/eval, workspace isolation, sessions, and tool approvals.
|
|
4
|
+
|
|
5
|
+
Managed editing requires an isolated native task and forces `apply: false` and `merge: false`. The extension records an integration admission only; a separate serialized host operation may apply a validated patch. There is no private import of OMP task internals and no claim that in-process extension code is sandboxed.
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
# Evaluation baseline
|
|
2
|
+
|
|
3
|
+
The initial deterministic baseline is 5 test files and 13 passing contract tests after the native core slice. The benchmark is intentionally modest: provider quality, latency, and cost are not known from local contract tests. Future evaluations compare equivalent objectives by acceptance quality, fresh-evidence rate, repair count, context size, and wall-clock overhead.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"nativeKernel": ["bizar-researcher", "bizar-planner", "bizar-architect", "bizar-implementer", "bizar-reviewer", "bizar-security-reviewer", "bizar-verifier", "bizar-docs"],
|
|
4
|
+
"strategy": "Re-author role contracts for OMP; retain useful names only as descriptive identities; do not copy Claude frontmatter or launch semantics.",
|
|
5
|
+
"catalogue": "The 88 legacy roles remain reference inventory in BizarHarness and are not shipped by this package until individually reviewed."
|
|
6
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"status": "beta",
|
|
4
|
+
"core": "native OMP extension",
|
|
5
|
+
"retiredFromPackage": ["Claude hooks", "AO orchestration", "Claude Agent SDK", "Bizar MCP server", "background daemon", "second provider router", "copied legacy CLI"],
|
|
6
|
+
"retainedAsMarkdownOrReference": ["role intent", "research rationale", "migration inventory", "security limitations"],
|
|
7
|
+
"optional": ["OpenKan CLI adapter", "native OMP memory surface"],
|
|
8
|
+
"not_yet_release_qualified": ["live provider/task quality", "host-specific OS isolation backends", "registry publication"]
|
|
9
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"source": "../BizarHarness",
|
|
4
|
+
"generatedFrom": "reference-only repository inventory on 2026-09-17",
|
|
5
|
+
"categories": [
|
|
6
|
+
{ "path": "config/claude/agents", "count": 88, "disposition": "port", "reason": "Re-author the useful role contracts as native OMP Markdown definitions." },
|
|
7
|
+
{ "path": "config/skills", "count": 61, "disposition": "merge", "reason": "Retain useful Markdown content selectively under native discovery; do not copy host hooks." },
|
|
8
|
+
{ "path": "config/claude/commands", "count": 39, "disposition": "native-replacement", "reason": "One native /bizar command replaces host-specific command wrappers." },
|
|
9
|
+
{ "path": "config/claude/hooks", "count": 48, "disposition": "retire", "reason": "OMP lifecycle handlers replace Claude hook dispatch." },
|
|
10
|
+
{ "path": "config/workflows", "count": 6, "disposition": "native-replacement", "reason": "Typed workflow reducers and native dispatch admission replace self-contained host scripts." },
|
|
11
|
+
{ "path": "packages/sdk/src", "count": 70, "disposition": "retire", "reason": "No second SDK, MCP server, provider router, or worker runtime in the native package." },
|
|
12
|
+
{ "path": "cli", "count": 60, "disposition": "native-replacement", "reason": "Thin CLI exposes the new journal/core boundary only." },
|
|
13
|
+
{ "path": "config/claude/CLAUDE.md and docs", "count": null, "disposition": "retain", "reason": "Markdown and historical rationale remain reference material and are not executable package runtime." }
|
|
14
|
+
],
|
|
15
|
+
"review": "Every category has an explicit port, merge, native replacement, optional, retire, or retain disposition. Individual legacy files are not copied into the new code path."
|
|
16
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# 0.2.0
|
|
2
|
+
|
|
3
|
+
- Add autonomous OMP settings installation, dry-run preview, install doctor, and restoration of installer-owned settings.
|
|
4
|
+
- Verify packed plugin discovery, eight native agents, seven skills, workflow tools, repeated install, and uninstall against OMP 18.2.2.
|
|
5
|
+
- Correct evidence freshness, worktree-specific state, lock ownership, and strict completion/integration checks.
|
|
6
|
+
- Add typed extension schemas and error results; avoid eagerly creating workflow state at startup.
|
|
7
|
+
- Publish public npm packages using GitHub OIDC once the maintainer configures npm trust.
|
|
8
|
+
|
|
9
|
+
Limitations: no provider-backed paid inference test; no automatic interception of every native task/eval call; JSONL storage is not SQLite; private-repository npm provenance is unavailable. Other OMP versions require qualification. Autonomous approval is intended for trusted projects, not hostile code.
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
# Beta acceptance
|
|
2
|
+
|
|
3
|
+
The beta gate is: `npm ci`, `npm run typecheck`, `npm test`, `npm run verify:package`, `npm run verify:docs`, and the Bun compatibility job. A fresh OMP session must load `dist/extension.js`, expose `/bizar`, and register all four Bizar tools. Live provider/task behavior is a host acceptance scenario and is reported separately from deterministic contract tests.
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
# Native release policy
|
|
2
|
+
|
|
3
|
+
The package is releasable when typecheck, tests, packed-install qualification, and documentation checks pass against the supported OMP/Bun baseline. A GitHub release is created from an exact `v<version>` tag; npm publication uses trusted publishing. See npm-publishing.md for setup and 0.2.0.md for remaining qualification limits. A passing release gate does not imply every native provider or worker route has been tested.
|