@jmanuelcorral/openteam 0.13.0 → 0.13.1
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.es.md +1 -1
- package/README.md +1 -1
- package/dist/cli.js +63 -12
- package/dist/commands/dispatch.d.ts +7 -0
- package/dist/commands/dispatch.d.ts.map +1 -1
- package/dist/commands/doctor.d.ts +13 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/purge.d.ts.map +1 -1
- package/dist/commands/setup.d.ts +19 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +198 -148
- package/dist/storage/graph/soakRecorder.d.ts +19 -0
- package/dist/storage/graph/soakRecorder.d.ts.map +1 -1
- package/package.json +1 -1
package/README.es.md
CHANGED
|
@@ -822,7 +822,7 @@ Consulta [docs/compatibility.md](docs/compatibility.md). Resumen verificado el `
|
|
|
822
822
|
|
|
823
823
|
| Superficie | Versión / contrato |
|
|
824
824
|
| --- | --- |
|
|
825
|
-
| openteam | `0.13.
|
|
825
|
+
| openteam | `0.13.1`; versión actual del paquete |
|
|
826
826
|
| `@opencode-ai/plugin` | `1.18.19` |
|
|
827
827
|
| `@opencode-ai/sdk` | `1.18.19` |
|
|
828
828
|
| Hook de routing | `chat.message`; no `chat.params` para cambiar modelo |
|
package/README.md
CHANGED
|
@@ -711,7 +711,7 @@ See [docs/compatibility.md](docs/compatibility.md). Verified summary as of `2026
|
|
|
711
711
|
|
|
712
712
|
| Surface | Version / contract |
|
|
713
713
|
| --- | --- |
|
|
714
|
-
| openteam | `0.13.
|
|
714
|
+
| openteam | `0.13.1`; current package version |
|
|
715
715
|
| `@opencode-ai/plugin` | `1.18.19` |
|
|
716
716
|
| `@opencode-ai/sdk` | `1.18.19` |
|
|
717
717
|
| Routing hook | `chat.message`; not `chat.params` for model changes |
|
package/dist/cli.js
CHANGED
|
@@ -10870,6 +10870,20 @@ function rosterHealthSection(audit, loadError, rosterRoleCount) {
|
|
|
10870
10870
|
}
|
|
10871
10871
|
return lines;
|
|
10872
10872
|
}
|
|
10873
|
+
function gitignoreSection(gitignore) {
|
|
10874
|
+
if (gitignore.missingRules.length === 0) {
|
|
10875
|
+
return [
|
|
10876
|
+
" gitignore:",
|
|
10877
|
+
` ✓ ${gitignore.path} ignores openteam's generated runtime state.`
|
|
10878
|
+
];
|
|
10879
|
+
}
|
|
10880
|
+
const quoted = gitignore.missingRules.map((rule) => `\`${rule}\``).join(", ");
|
|
10881
|
+
const lines = [" gitignore:"];
|
|
10882
|
+
lines.push(gitignore.exists ? ` ✗ ${gitignore.path} is missing openteam ignore rule(s): ${gitignore.missingRules.join(", ")}` : ` ✗ ${gitignore.path} does not exist, so no openteam ignore rule(s) are in place: ${gitignore.missingRules.join(", ")}`);
|
|
10883
|
+
lines.push(" problem: openteam writes machine-local runtime output (telemetry, graph state, soak recordings) that must not be committed.");
|
|
10884
|
+
lines.push(` remedy: add ${quoted} to ${gitignore.path} (or re-run \`openteam setup\`), then re-run \`openteam doctor\`.`);
|
|
10885
|
+
return lines;
|
|
10886
|
+
}
|
|
10873
10887
|
function agentModelsSection(diagnostics, searchedPaths) {
|
|
10874
10888
|
const lines = [" agent models:"];
|
|
10875
10889
|
if (diagnostics.length === 0) {
|
|
@@ -10917,6 +10931,9 @@ function renderDoctor(input) {
|
|
|
10917
10931
|
lines.push(...diagnosticsSection(input.diagnostics));
|
|
10918
10932
|
}
|
|
10919
10933
|
lines.push(...rosterHealthSection(input.rosterAudit, input.rosterLoadError, input.rosterRoleCount));
|
|
10934
|
+
if (input.gitignore !== undefined) {
|
|
10935
|
+
lines.push(...gitignoreSection(input.gitignore));
|
|
10936
|
+
}
|
|
10920
10937
|
if (input.otelBackend !== undefined) {
|
|
10921
10938
|
const otel = input.otelBackend;
|
|
10922
10939
|
lines.push(" opentelemetry:");
|
|
@@ -11240,6 +11257,12 @@ function mergeOpencodeConfigs(base, override) {
|
|
|
11240
11257
|
return result;
|
|
11241
11258
|
}
|
|
11242
11259
|
|
|
11260
|
+
// src/storage/graph/soakRecorder.ts
|
|
11261
|
+
var SOAK_EVIDENCE_DIR = ".opencode/soak";
|
|
11262
|
+
var SOAK_RECORDER_BASE_DIR = ".opencode";
|
|
11263
|
+
var SOAK_RECORDER_ID_FILENAME = "soak-recorder-id";
|
|
11264
|
+
var SOAK_RECORDER_ID_PATH = `${SOAK_RECORDER_BASE_DIR}/${SOAK_RECORDER_ID_FILENAME}`;
|
|
11265
|
+
|
|
11243
11266
|
// src/commands/frontierCatalog.ts
|
|
11244
11267
|
function weightedCost(inputUSD, outputUSD) {
|
|
11245
11268
|
return 0.75 * inputUSD + 0.25 * outputUSD;
|
|
@@ -11277,6 +11300,11 @@ var GENERATED_OPENTEAM_STATE_PATHS = [
|
|
|
11277
11300
|
DEFAULT_STORAGE_SQLITE_INDEX_PATH,
|
|
11278
11301
|
DEFAULT_MEMORY_INDEX_PATH
|
|
11279
11302
|
];
|
|
11303
|
+
var GENERATED_OPENTEAM_STATE_GROUPS = [
|
|
11304
|
+
{ kind: "dir", paths: GENERATED_OPENTEAM_STATE_PATHS },
|
|
11305
|
+
{ kind: "dir", paths: [SOAK_EVIDENCE_DIR] },
|
|
11306
|
+
{ kind: "file", paths: [SOAK_RECORDER_ID_PATH] }
|
|
11307
|
+
];
|
|
11280
11308
|
var OPENCODE_DIR = ".opencode";
|
|
11281
11309
|
var AGENT_DIR = `${OPENCODE_DIR}/agent`;
|
|
11282
11310
|
var ROLE_AGENT_DESCRIPTIONS = {
|
|
@@ -11347,17 +11375,16 @@ function commonGeneratedStateRoot(paths) {
|
|
|
11347
11375
|
}
|
|
11348
11376
|
return common.join("/");
|
|
11349
11377
|
}
|
|
11350
|
-
function generatedStateIgnoreRule() {
|
|
11351
|
-
const root = commonGeneratedStateRoot(
|
|
11378
|
+
function generatedStateIgnoreRule(group) {
|
|
11379
|
+
const root = commonGeneratedStateRoot(group.paths);
|
|
11352
11380
|
const opencodePrefix = `${OPENCODE_DIR}/`;
|
|
11353
11381
|
if (!root.startsWith(opencodePrefix)) {
|
|
11354
11382
|
throw new Error(`generated openteam state path is outside ${OPENCODE_DIR}`);
|
|
11355
11383
|
}
|
|
11356
|
-
|
|
11384
|
+
const rule = root.slice(opencodePrefix.length);
|
|
11385
|
+
return group.kind === "dir" ? `${rule}/` : rule;
|
|
11357
11386
|
}
|
|
11358
|
-
var OPENCODE_GITIGNORE_GENERATED_STATE_RULES =
|
|
11359
|
-
generatedStateIgnoreRule()
|
|
11360
|
-
];
|
|
11387
|
+
var OPENCODE_GITIGNORE_GENERATED_STATE_RULES = GENERATED_OPENTEAM_STATE_GROUPS.map(generatedStateIgnoreRule);
|
|
11361
11388
|
var LEGACY_OPENCODE_GITIGNORE_STATE_RULES = ["openteam/"];
|
|
11362
11389
|
var LEGACY_LOCAL_OPENCODE_GITIGNORE_RULES = [
|
|
11363
11390
|
"openteam/sessions/",
|
|
@@ -11393,6 +11420,13 @@ function buildOpencodeGitignore(existing = "") {
|
|
|
11393
11420
|
`)}
|
|
11394
11421
|
`;
|
|
11395
11422
|
}
|
|
11423
|
+
function activeGitignoreRules(gitignore) {
|
|
11424
|
+
return gitignore.split(/\r?\n/).map(normalizeGitignoreRule).filter((line) => line.length > 0 && !line.startsWith("#"));
|
|
11425
|
+
}
|
|
11426
|
+
function missingGeneratedStateRules(gitignore) {
|
|
11427
|
+
const present = new Set(activeGitignoreRules(gitignore));
|
|
11428
|
+
return OPENCODE_GITIGNORE_GENERATED_STATE_RULES.filter((rule) => !present.has(rule));
|
|
11429
|
+
}
|
|
11396
11430
|
var KNOWN_RUNTIMES = [
|
|
11397
11431
|
{
|
|
11398
11432
|
id: "ollama",
|
|
@@ -11956,7 +11990,7 @@ function resolveStaticPurgeItems(config, paths) {
|
|
|
11956
11990
|
...paths.opencodeConfigPaths.map((p) => ({ kind: "opencode-config", path: p })),
|
|
11957
11991
|
{ kind: "gitignore", path: paths.gitignorePath }
|
|
11958
11992
|
],
|
|
11959
|
-
roster: [],
|
|
11993
|
+
roster: [{ kind: "file", path: OPENTEAM_ROSTER_PATH }],
|
|
11960
11994
|
decisions: [
|
|
11961
11995
|
{ kind: "file", path: paths.decisionsPath },
|
|
11962
11996
|
{ kind: "file", path: paths.telemetryPath }
|
|
@@ -12248,8 +12282,12 @@ function categoryPrompt(id, items) {
|
|
|
12248
12282
|
return "Remove openteam configuration and wiring?";
|
|
12249
12283
|
case "roster": {
|
|
12250
12284
|
const names = items.filter((item) => item.kind === "agent").map((item) => item.name);
|
|
12251
|
-
const
|
|
12252
|
-
|
|
12285
|
+
const hasRegistry = items.some((item) => item.kind === "file" && item.path === OPENTEAM_ROSTER_PATH);
|
|
12286
|
+
const plural = names.length === 1 ? "" : "s";
|
|
12287
|
+
const agentNames = names.length > 0 ? `: ${names.join(", ")}` : "";
|
|
12288
|
+
const agentClause = `${names.length} user agent${plural}${agentNames}`;
|
|
12289
|
+
const parts = hasRegistry ? [`roster registry (${OPENTEAM_ROSTER_PATH})`, agentClause] : [agentClause];
|
|
12290
|
+
return `Remove the agent roster? (${parts.join("; ")})`;
|
|
12253
12291
|
}
|
|
12254
12292
|
case "decisions":
|
|
12255
12293
|
return "Remove decisions and telemetry?";
|
|
@@ -12311,7 +12349,9 @@ async function collectCategories(input) {
|
|
|
12311
12349
|
const { runtime, config, paths } = input;
|
|
12312
12350
|
const staticItems = resolveStaticPurgeItems(config, paths);
|
|
12313
12351
|
const agents = await runtime.port.listAgents();
|
|
12314
|
-
const
|
|
12352
|
+
const discoveredAgents = agents.filter((agent) => path2.resolve(agent.path) !== path2.resolve(paths.orchestratorAgentPath)).map((agent) => ({ kind: "agent", path: agent.path, name: agent.name }));
|
|
12353
|
+
const rosterRegistry = await presentItemsFor(runtime.port, staticItems.roster);
|
|
12354
|
+
const rosterItems = [...rosterRegistry, ...discoveredAgents];
|
|
12315
12355
|
const worktrees = await runtime.port.listWorktrees();
|
|
12316
12356
|
const worktreeItems = worktrees.map((worktree) => ({
|
|
12317
12357
|
kind: "worktree",
|
|
@@ -13389,6 +13429,15 @@ async function runCli(argv, deps) {
|
|
|
13389
13429
|
...defaultModel !== undefined ? { defaultModel } : {}
|
|
13390
13430
|
});
|
|
13391
13431
|
const legacyLayout = deps.detectLegacyLayout !== undefined ? await deps.detectLegacyLayout() : undefined;
|
|
13432
|
+
let gitignoreCoverage;
|
|
13433
|
+
if (deps.readGitignore !== undefined) {
|
|
13434
|
+
const raw = await deps.readGitignore();
|
|
13435
|
+
gitignoreCoverage = {
|
|
13436
|
+
path: OPENCODE_GITIGNORE_PATH,
|
|
13437
|
+
exists: raw !== undefined,
|
|
13438
|
+
missingRules: missingGeneratedStateRules(raw ?? "")
|
|
13439
|
+
};
|
|
13440
|
+
}
|
|
13392
13441
|
const otelBackend = describeOtelBackendForDoctor({
|
|
13393
13442
|
backend: "opentelemetry",
|
|
13394
13443
|
connectionEnv: "APPLICATIONINSIGHTS_CONNECTION_STRING"
|
|
@@ -13421,7 +13470,8 @@ async function runCli(argv, deps) {
|
|
|
13421
13470
|
...opencodeConfigError !== undefined ? { opencodeConfigError } : {},
|
|
13422
13471
|
...cacheEntries !== undefined ? { cacheEntries, cliVersion: deps.version } : {},
|
|
13423
13472
|
...legacyLayout !== undefined && legacyLayout.length > 0 ? { legacyLayout } : {},
|
|
13424
|
-
...otelBackend !== undefined ? { otelBackend } : {}
|
|
13473
|
+
...otelBackend !== undefined ? { otelBackend } : {},
|
|
13474
|
+
...gitignoreCoverage !== undefined ? { gitignore: gitignoreCoverage } : {}
|
|
13425
13475
|
})
|
|
13426
13476
|
};
|
|
13427
13477
|
}
|
|
@@ -15456,7 +15506,7 @@ async function buildMemoryRuntimeFromConfig(config, deps, options = {}) {
|
|
|
15456
15506
|
// package.json
|
|
15457
15507
|
var package_default = {
|
|
15458
15508
|
name: "@jmanuelcorral/openteam",
|
|
15459
|
-
version: "0.13.
|
|
15509
|
+
version: "0.13.1",
|
|
15460
15510
|
packageManager: "bun@1.3.14",
|
|
15461
15511
|
description: "Cost-aware, local-first routing plugin for opencode with cheapest-capable frontier fallback and multi-agent orchestration.",
|
|
15462
15512
|
license: "MIT",
|
|
@@ -15773,6 +15823,7 @@ var deps = {
|
|
|
15773
15823
|
loopRuntime: createCliLoopRuntime(),
|
|
15774
15824
|
loadRosterForDoctor: readStoredRosterForDoctor,
|
|
15775
15825
|
auditRoster: auditStoredRosterForDoctor,
|
|
15826
|
+
readGitignore: () => storage.read(OPENCODE_GITIGNORE_PATH),
|
|
15776
15827
|
version: PACKAGE_VERSION
|
|
15777
15828
|
};
|
|
15778
15829
|
function createCliPurgeRuntime() {
|
|
@@ -61,6 +61,13 @@ export type CliDeps = {
|
|
|
61
61
|
* migration section. Absent in composition roots that do not probe the disk.
|
|
62
62
|
*/
|
|
63
63
|
detectLegacyLayout?: () => Promise<readonly LegacyLayoutFinding[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Reads `.opencode/.gitignore` for the `openteam doctor` coverage check
|
|
66
|
+
* (returns `undefined` when the file is absent). Optional so composition roots
|
|
67
|
+
* that do not touch the disk can omit it; when absent, doctor omits the
|
|
68
|
+
* `gitignore:` section rather than guessing.
|
|
69
|
+
*/
|
|
70
|
+
readGitignore?: () => Promise<string | undefined>;
|
|
64
71
|
/**
|
|
65
72
|
* Executes the P15b legacy-layout migration (`openteam migrate`): physically
|
|
66
73
|
* relocates pre-split artifacts to their current homes and returns a report.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EAErB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAOjE,OAAO,KAAK,EAAY,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAG3D,OAAO,KAAK,EACV,uBAAuB,EACvB,YAAY,EAEZ,aAAa,EACd,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,KAAK,gBAAgB,EAAc,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAA2B,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC7B,MAAM,oCAAoC,CAAC;AAE5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EACL,KAAK,SAAS,EASf,MAAM,UAAU,CAAC;AAOlB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,EACL,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -67,6 +67,19 @@ export type DoctorInput = {
|
|
|
67
67
|
* it without aborting the rest of the health report.
|
|
68
68
|
*/
|
|
69
69
|
rosterLoadError?: string;
|
|
70
|
+
/**
|
|
71
|
+
* Coverage of openteam's runtime-generated state by `.opencode/.gitignore`,
|
|
72
|
+
* computed at the command boundary (`missingGeneratedStateRules`). When
|
|
73
|
+
* `missingRules` is non-empty, doctor prints a ✗ check with a remedy naming
|
|
74
|
+
* the exact rules to add — the repair `openteam setup` never performs on an
|
|
75
|
+
* already-configured project. Absent in composition roots that do not read
|
|
76
|
+
* the file.
|
|
77
|
+
*/
|
|
78
|
+
gitignore?: {
|
|
79
|
+
readonly path: string;
|
|
80
|
+
readonly exists: boolean;
|
|
81
|
+
readonly missingRules: readonly string[];
|
|
82
|
+
};
|
|
70
83
|
};
|
|
71
84
|
export type DoctorDiagnostic = {
|
|
72
85
|
readonly ts: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,EACL,KAAK,cAAc,EAEpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EACV,oBAAoB,EAGrB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,iEAAiE;IACjE,YAAY,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACrC,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAC9C;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC9C;;;;OAIG;IACH,WAAW,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC1C;;;;OAIG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"purge.d.ts","sourceRoot":"","sources":["../../src/commands/purge.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,cAAc,EAEpB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"purge.d.ts","sourceRoot":"","sources":["../../src/commands/purge.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,cAAc,EAEpB,MAAM,kBAAkB,CAAC;AAK1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAO5C;;;;;;GAMG;AACH,QAAA,MAAM,kBAAkB,YACtB,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,OAAO,EACP,WAAW,CACH,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,iFAAiF;AACjF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAO/D,CAAC;AA0BF,4CAA4C;AAC5C,MAAM,MAAM,SAAS,GACjB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACxE;IAAE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrD;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEN,2EAA2E;AAC3E,MAAM,MAAM,oBAAoB,GAC5B;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GAC9B;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,6DAA6D;AAC7D,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,2DAA2D;IAC3D,QAAQ,IAAI,MAAM,CAAC;IACnB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,wEAAwE;IACxE,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACvD,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,oEAAoE;IACpE,UAAU,IAAI,OAAO,CAAC,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;IACjE,6EAA6E;IAC7E,aAAa,IAAI,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CAAC;IACnD,6DAA6D;IAC7D,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACpE,sEAAsE;IACtE,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC;AAED,4EAA4E;AAC5E,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,KAAK,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;AAEhC,8DAA8D;AAC9D,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,OAAO,CAAC;IACtC,gEAAgE;IAChE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,mEAAmE;AACnE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,2EAA2E;IAC3E,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,wDAAwD;IACxD,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,gEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;CAC7D,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,iFAAiF;IACjF,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAyvBF;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CA0EpE"}
|
package/dist/commands/setup.d.ts
CHANGED
|
@@ -13,6 +13,11 @@ export declare const OPENCODE_GITIGNORE_PATH = ".opencode/.gitignore";
|
|
|
13
13
|
* `.gitignore` rule collapses to one line covering the whole directory. The
|
|
14
14
|
* **portable** memory records (`.opencode/openteam/memory/records.jsonl`) are
|
|
15
15
|
* deliberately absent: they are committed team-state, not ignored output.
|
|
16
|
+
*
|
|
17
|
+
* This is only ONE group of generated state. Runtime output written OUTSIDE
|
|
18
|
+
* `.opencode/openteam-local/` (the shadow soak pipeline) lives in
|
|
19
|
+
* {@link GENERATED_OPENTEAM_STATE_GROUPS}; a single common-prefix collapse over
|
|
20
|
+
* everything would drop to `.opencode` and emit no usable rule.
|
|
16
21
|
*/
|
|
17
22
|
export declare const GENERATED_OPENTEAM_STATE_PATHS: readonly [".opencode/openteam-local/telemetry.jsonl", ".opencode/openteam-local/sessions", ".opencode/openteam-local/graph/runs", ".opencode/openteam-local/graph/worktrees", ".opencode/openteam-local/index.sqlite", ".opencode/openteam-local/memory/index.sqlite"];
|
|
18
23
|
/** One standard subagent file `setup` writes into `.opencode/agent/`. */
|
|
@@ -34,7 +39,7 @@ export type RoleAgentFile = {
|
|
|
34
39
|
* order.
|
|
35
40
|
*/
|
|
36
41
|
export declare function buildRoleAgentFiles(): RoleAgentFile[];
|
|
37
|
-
export declare const OPENCODE_GITIGNORE_GENERATED_STATE_RULES: readonly [
|
|
42
|
+
export declare const OPENCODE_GITIGNORE_GENERATED_STATE_RULES: readonly string[];
|
|
38
43
|
/**
|
|
39
44
|
* Pre-P15b generated ignore rule. Before the portable/local split, all openteam
|
|
40
45
|
* runtime state lived under `.opencode/openteam/`, so setup wrote a single
|
|
@@ -54,6 +59,19 @@ export declare const LEGACY_OPENCODE_GITIGNORE_STATE_RULES: readonly ["openteam/
|
|
|
54
59
|
*/
|
|
55
60
|
export declare const LEGACY_LOCAL_OPENCODE_GITIGNORE_RULES: readonly ["openteam/sessions/", "openteam/graph/", "openteam/index.sqlite", "openteam/memory/index.sqlite"];
|
|
56
61
|
export declare function buildOpencodeGitignore(existing?: string): string;
|
|
62
|
+
/**
|
|
63
|
+
* The openteam runtime-generated-state rules
|
|
64
|
+
* ({@link OPENCODE_GITIGNORE_GENERATED_STATE_RULES}) NOT present in `gitignore`,
|
|
65
|
+
* in canonical order. Empty when every rule is already covered. Pure.
|
|
66
|
+
*
|
|
67
|
+
* `openteam doctor` uses it to flag an already-configured install whose
|
|
68
|
+
* `.opencode/.gitignore` predates a rule (e.g. the soak recordings added in
|
|
69
|
+
* v0.13.0), which `openteam setup` alone never repairs because it does not
|
|
70
|
+
* re-run on existing projects. Matching is exact-normalised, mirroring
|
|
71
|
+
* {@link buildOpencodeGitignore}, so what doctor reports missing is exactly what
|
|
72
|
+
* setup would add.
|
|
73
|
+
*/
|
|
74
|
+
export declare function missingGeneratedStateRules(gitignore: string): string[];
|
|
57
75
|
export type KnownRuntime = {
|
|
58
76
|
id: LocalRuntimeId;
|
|
59
77
|
label: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAMpE,OAAO,EAOL,KAAK,cAAc,EAEnB,KAAK,WAAW,EAChB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,MAAM,EAEX,KAAK,YAAY,EAGlB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,KAAK,EAAE,OAAO,EAAwB,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAGL,KAAK,cAAc,EAGpB,MAAM,2BAA2B,CAAC;AAOnC,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,kBAAkB,CAAC;AAQ1B,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,iBAAiB,CAAC;AAezB,OAAO,EAEL,eAAe,EAEhB,MAAM,kBAAkB,CAAC;AAgD1B,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -8141,6 +8141,20 @@ function rosterHealthSection(audit, loadError, rosterRoleCount) {
|
|
|
8141
8141
|
}
|
|
8142
8142
|
return lines;
|
|
8143
8143
|
}
|
|
8144
|
+
function gitignoreSection(gitignore) {
|
|
8145
|
+
if (gitignore.missingRules.length === 0) {
|
|
8146
|
+
return [
|
|
8147
|
+
" gitignore:",
|
|
8148
|
+
` ✓ ${gitignore.path} ignores openteam's generated runtime state.`
|
|
8149
|
+
];
|
|
8150
|
+
}
|
|
8151
|
+
const quoted = gitignore.missingRules.map((rule) => `\`${rule}\``).join(", ");
|
|
8152
|
+
const lines = [" gitignore:"];
|
|
8153
|
+
lines.push(gitignore.exists ? ` ✗ ${gitignore.path} is missing openteam ignore rule(s): ${gitignore.missingRules.join(", ")}` : ` ✗ ${gitignore.path} does not exist, so no openteam ignore rule(s) are in place: ${gitignore.missingRules.join(", ")}`);
|
|
8154
|
+
lines.push(" problem: openteam writes machine-local runtime output (telemetry, graph state, soak recordings) that must not be committed.");
|
|
8155
|
+
lines.push(` remedy: add ${quoted} to ${gitignore.path} (or re-run \`openteam setup\`), then re-run \`openteam doctor\`.`);
|
|
8156
|
+
return lines;
|
|
8157
|
+
}
|
|
8144
8158
|
function agentModelsSection(diagnostics, searchedPaths) {
|
|
8145
8159
|
const lines = [" agent models:"];
|
|
8146
8160
|
if (diagnostics.length === 0) {
|
|
@@ -8188,6 +8202,9 @@ function renderDoctor(input) {
|
|
|
8188
8202
|
lines.push(...diagnosticsSection(input.diagnostics));
|
|
8189
8203
|
}
|
|
8190
8204
|
lines.push(...rosterHealthSection(input.rosterAudit, input.rosterLoadError, input.rosterRoleCount));
|
|
8205
|
+
if (input.gitignore !== undefined) {
|
|
8206
|
+
lines.push(...gitignoreSection(input.gitignore));
|
|
8207
|
+
}
|
|
8191
8208
|
if (input.otelBackend !== undefined) {
|
|
8192
8209
|
const otel = input.otelBackend;
|
|
8193
8210
|
lines.push(" opentelemetry:");
|
|
@@ -8453,6 +8470,143 @@ function renderMigration(report) {
|
|
|
8453
8470
|
// src/commands/purge.ts
|
|
8454
8471
|
import * as path3 from "node:path";
|
|
8455
8472
|
|
|
8473
|
+
// src/storage/graph/soakRecorder.ts
|
|
8474
|
+
var SOAK_EVIDENCE_DIR = ".opencode/soak";
|
|
8475
|
+
var SOAK_RECORDER_BASE_DIR = ".opencode";
|
|
8476
|
+
var SOAK_RECORDER_ID_FILENAME = "soak-recorder-id";
|
|
8477
|
+
var SOAK_RECORDER_ID_PATH = `${SOAK_RECORDER_BASE_DIR}/${SOAK_RECORDER_ID_FILENAME}`;
|
|
8478
|
+
async function ensureRecorderId(ports, basePath) {
|
|
8479
|
+
const idPath = `${basePath}/${SOAK_RECORDER_ID_FILENAME}`;
|
|
8480
|
+
if (await ports.fs.exists(idPath)) {
|
|
8481
|
+
const id = (await ports.fs.readFile(idPath)).trim();
|
|
8482
|
+
if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/.test(id)) {
|
|
8483
|
+
return id;
|
|
8484
|
+
}
|
|
8485
|
+
}
|
|
8486
|
+
const newId = ports.id.randomUUID();
|
|
8487
|
+
await ports.fs.writeFile(idPath, newId);
|
|
8488
|
+
return newId;
|
|
8489
|
+
}
|
|
8490
|
+
async function readAllChains(ports, evidenceDir) {
|
|
8491
|
+
if (!await ports.fs.exists(evidenceDir)) {
|
|
8492
|
+
return { chains: [], rejectedLines: 0, rejections: [] };
|
|
8493
|
+
}
|
|
8494
|
+
const files = await ports.fs.readDir(evidenceDir);
|
|
8495
|
+
const chains = [];
|
|
8496
|
+
const rejections = [];
|
|
8497
|
+
for (const file of files) {
|
|
8498
|
+
if (!file.endsWith(".jsonl")) {
|
|
8499
|
+
continue;
|
|
8500
|
+
}
|
|
8501
|
+
const content = await ports.fs.readFile(`${evidenceDir}/${file}`);
|
|
8502
|
+
const lines = content.split(`
|
|
8503
|
+
`);
|
|
8504
|
+
const observations = [];
|
|
8505
|
+
for (const [index, line] of lines.entries()) {
|
|
8506
|
+
if (line.trim().length === 0) {
|
|
8507
|
+
continue;
|
|
8508
|
+
}
|
|
8509
|
+
const lineNumber = index + 1;
|
|
8510
|
+
let rawParsed;
|
|
8511
|
+
try {
|
|
8512
|
+
rawParsed = JSON.parse(line);
|
|
8513
|
+
} catch {
|
|
8514
|
+
rejections.push({ file, lineNumber, detail: "invalid JSON" });
|
|
8515
|
+
continue;
|
|
8516
|
+
}
|
|
8517
|
+
const parsed = SoakObservationSchema.safeParse(rawParsed);
|
|
8518
|
+
if (parsed.success) {
|
|
8519
|
+
observations.push(parsed.data);
|
|
8520
|
+
} else {
|
|
8521
|
+
rejections.push({
|
|
8522
|
+
file,
|
|
8523
|
+
lineNumber,
|
|
8524
|
+
detail: formatSoakObservationIssues(parsed.error.issues)
|
|
8525
|
+
});
|
|
8526
|
+
}
|
|
8527
|
+
}
|
|
8528
|
+
if (observations.length > 0) {
|
|
8529
|
+
chains.push(observations);
|
|
8530
|
+
}
|
|
8531
|
+
}
|
|
8532
|
+
return { chains, rejectedLines: rejections.length, rejections };
|
|
8533
|
+
}
|
|
8534
|
+
function formatSoakObservationIssues(issues) {
|
|
8535
|
+
return issues.map((i) => `${i.path.join(".")}: ${i.code}`).join("; ");
|
|
8536
|
+
}
|
|
8537
|
+
function canonicalObservationPreimage2(obs) {
|
|
8538
|
+
return JSON.stringify({
|
|
8539
|
+
version: obs.version,
|
|
8540
|
+
seq: obs.seq,
|
|
8541
|
+
timestamp: obs.timestamp,
|
|
8542
|
+
platform: obs.platform,
|
|
8543
|
+
opencodeVersion: obs.opencodeVersion,
|
|
8544
|
+
provenance: obs.provenance,
|
|
8545
|
+
traceDigest: obs.traceDigest,
|
|
8546
|
+
criticalDivergences: obs.criticalDivergences,
|
|
8547
|
+
privacy: obs.privacy,
|
|
8548
|
+
duplicateEffects: obs.duplicateEffects,
|
|
8549
|
+
modelVerification: obs.modelVerification
|
|
8550
|
+
});
|
|
8551
|
+
}
|
|
8552
|
+
async function appendObservation(ports, evidenceDir, recorderId, input) {
|
|
8553
|
+
if (input.opencodeVersion === "unknown") {
|
|
8554
|
+
throw new Error("opencode-version-unreadable");
|
|
8555
|
+
}
|
|
8556
|
+
await ports.fs.mkdir(evidenceDir);
|
|
8557
|
+
const chainPath = `${evidenceDir}/${recorderId}.jsonl`;
|
|
8558
|
+
let seq = 0;
|
|
8559
|
+
let prevChainDigest = "0".repeat(64);
|
|
8560
|
+
if (await ports.fs.exists(chainPath)) {
|
|
8561
|
+
const content = await ports.fs.readFile(chainPath);
|
|
8562
|
+
const lines = content.split(`
|
|
8563
|
+
`).filter((l) => l.trim().length > 0);
|
|
8564
|
+
if (lines.length > 0) {
|
|
8565
|
+
const lastLine = lines[lines.length - 1];
|
|
8566
|
+
let rawParsed;
|
|
8567
|
+
try {
|
|
8568
|
+
rawParsed = JSON.parse(lastLine);
|
|
8569
|
+
} catch {
|
|
8570
|
+
throw new Error("corrupt chain tail: invalid JSON");
|
|
8571
|
+
}
|
|
8572
|
+
const parsed = SoakObservationSchema.safeParse(rawParsed);
|
|
8573
|
+
if (!parsed.success) {
|
|
8574
|
+
const detail = parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.code}`).join("; ");
|
|
8575
|
+
throw new Error(`corrupt chain tail: ${detail}`);
|
|
8576
|
+
}
|
|
8577
|
+
seq = parsed.data.seq + 1;
|
|
8578
|
+
prevChainDigest = parsed.data.chainDigest;
|
|
8579
|
+
}
|
|
8580
|
+
}
|
|
8581
|
+
const timestamp = ports.clock.now();
|
|
8582
|
+
const base = {
|
|
8583
|
+
version: 1,
|
|
8584
|
+
seq,
|
|
8585
|
+
timestamp,
|
|
8586
|
+
platform: input.platform,
|
|
8587
|
+
opencodeVersion: input.opencodeVersion,
|
|
8588
|
+
provenance: input.provenance,
|
|
8589
|
+
traceDigest: input.traceDigest,
|
|
8590
|
+
criticalDivergences: input.criticalDivergences,
|
|
8591
|
+
privacy: input.privacy,
|
|
8592
|
+
duplicateEffects: input.duplicateEffects,
|
|
8593
|
+
modelVerification: input.modelVerification
|
|
8594
|
+
};
|
|
8595
|
+
const preimage = canonicalObservationPreimage2(base);
|
|
8596
|
+
const chainDigest = sha256Hex(prevChainDigest + preimage);
|
|
8597
|
+
const observation = { ...base, chainDigest };
|
|
8598
|
+
assertReferenceOnly(observation);
|
|
8599
|
+
const line = JSON.stringify(observation);
|
|
8600
|
+
if (await ports.fs.exists(chainPath)) {
|
|
8601
|
+
const existing = await ports.fs.readFile(chainPath);
|
|
8602
|
+
await ports.fs.writeFile(chainPath, `${existing}
|
|
8603
|
+
${line}`);
|
|
8604
|
+
} else {
|
|
8605
|
+
await ports.fs.writeFile(chainPath, line);
|
|
8606
|
+
}
|
|
8607
|
+
return observation;
|
|
8608
|
+
}
|
|
8609
|
+
|
|
8456
8610
|
// src/commands/setup.ts
|
|
8457
8611
|
var OPENTEAM_PLUGIN_SPEC = "@jmanuelcorral/openteam";
|
|
8458
8612
|
var OPENCODE_GITIGNORE_PATH = ".opencode/.gitignore";
|
|
@@ -8464,6 +8618,11 @@ var GENERATED_OPENTEAM_STATE_PATHS = [
|
|
|
8464
8618
|
DEFAULT_STORAGE_SQLITE_INDEX_PATH,
|
|
8465
8619
|
DEFAULT_MEMORY_INDEX_PATH
|
|
8466
8620
|
];
|
|
8621
|
+
var GENERATED_OPENTEAM_STATE_GROUPS = [
|
|
8622
|
+
{ kind: "dir", paths: GENERATED_OPENTEAM_STATE_PATHS },
|
|
8623
|
+
{ kind: "dir", paths: [SOAK_EVIDENCE_DIR] },
|
|
8624
|
+
{ kind: "file", paths: [SOAK_RECORDER_ID_PATH] }
|
|
8625
|
+
];
|
|
8467
8626
|
var OPENCODE_DIR = ".opencode";
|
|
8468
8627
|
var AGENT_DIR = `${OPENCODE_DIR}/agent`;
|
|
8469
8628
|
function splitSetupPath(path3) {
|
|
@@ -8484,18 +8643,27 @@ function commonGeneratedStateRoot(paths) {
|
|
|
8484
8643
|
}
|
|
8485
8644
|
return common.join("/");
|
|
8486
8645
|
}
|
|
8487
|
-
function generatedStateIgnoreRule() {
|
|
8488
|
-
const root = commonGeneratedStateRoot(
|
|
8646
|
+
function generatedStateIgnoreRule(group) {
|
|
8647
|
+
const root = commonGeneratedStateRoot(group.paths);
|
|
8489
8648
|
const opencodePrefix = `${OPENCODE_DIR}/`;
|
|
8490
8649
|
if (!root.startsWith(opencodePrefix)) {
|
|
8491
8650
|
throw new Error(`generated openteam state path is outside ${OPENCODE_DIR}`);
|
|
8492
8651
|
}
|
|
8493
|
-
|
|
8652
|
+
const rule = root.slice(opencodePrefix.length);
|
|
8653
|
+
return group.kind === "dir" ? `${rule}/` : rule;
|
|
8494
8654
|
}
|
|
8495
|
-
var OPENCODE_GITIGNORE_GENERATED_STATE_RULES =
|
|
8496
|
-
generatedStateIgnoreRule()
|
|
8497
|
-
];
|
|
8655
|
+
var OPENCODE_GITIGNORE_GENERATED_STATE_RULES = GENERATED_OPENTEAM_STATE_GROUPS.map(generatedStateIgnoreRule);
|
|
8498
8656
|
var LEGACY_OPENCODE_GITIGNORE_STATE_RULES = ["openteam/"];
|
|
8657
|
+
function normalizeGitignoreRule(line) {
|
|
8658
|
+
return line.trim().replace(/^\/+/, "");
|
|
8659
|
+
}
|
|
8660
|
+
function activeGitignoreRules(gitignore) {
|
|
8661
|
+
return gitignore.split(/\r?\n/).map(normalizeGitignoreRule).filter((line) => line.length > 0 && !line.startsWith("#"));
|
|
8662
|
+
}
|
|
8663
|
+
function missingGeneratedStateRules(gitignore) {
|
|
8664
|
+
const present = new Set(activeGitignoreRules(gitignore));
|
|
8665
|
+
return OPENCODE_GITIGNORE_GENERATED_STATE_RULES.filter((rule) => !present.has(rule));
|
|
8666
|
+
}
|
|
8499
8667
|
|
|
8500
8668
|
// src/commands/purge.ts
|
|
8501
8669
|
var PURGE_CATEGORY_IDS = [
|
|
@@ -8543,7 +8711,7 @@ function resolveStaticPurgeItems(config, paths) {
|
|
|
8543
8711
|
...paths.opencodeConfigPaths.map((p) => ({ kind: "opencode-config", path: p })),
|
|
8544
8712
|
{ kind: "gitignore", path: paths.gitignorePath }
|
|
8545
8713
|
],
|
|
8546
|
-
roster: [],
|
|
8714
|
+
roster: [{ kind: "file", path: OPENTEAM_ROSTER_PATH }],
|
|
8547
8715
|
decisions: [
|
|
8548
8716
|
{ kind: "file", path: paths.decisionsPath },
|
|
8549
8717
|
{ kind: "file", path: paths.telemetryPath }
|
|
@@ -8835,8 +9003,12 @@ function categoryPrompt(id, items) {
|
|
|
8835
9003
|
return "Remove openteam configuration and wiring?";
|
|
8836
9004
|
case "roster": {
|
|
8837
9005
|
const names = items.filter((item) => item.kind === "agent").map((item) => item.name);
|
|
8838
|
-
const
|
|
8839
|
-
|
|
9006
|
+
const hasRegistry = items.some((item) => item.kind === "file" && item.path === OPENTEAM_ROSTER_PATH);
|
|
9007
|
+
const plural = names.length === 1 ? "" : "s";
|
|
9008
|
+
const agentNames = names.length > 0 ? `: ${names.join(", ")}` : "";
|
|
9009
|
+
const agentClause = `${names.length} user agent${plural}${agentNames}`;
|
|
9010
|
+
const parts = hasRegistry ? [`roster registry (${OPENTEAM_ROSTER_PATH})`, agentClause] : [agentClause];
|
|
9011
|
+
return `Remove the agent roster? (${parts.join("; ")})`;
|
|
8840
9012
|
}
|
|
8841
9013
|
case "decisions":
|
|
8842
9014
|
return "Remove decisions and telemetry?";
|
|
@@ -8898,7 +9070,9 @@ async function collectCategories(input) {
|
|
|
8898
9070
|
const { runtime, config, paths } = input;
|
|
8899
9071
|
const staticItems = resolveStaticPurgeItems(config, paths);
|
|
8900
9072
|
const agents = await runtime.port.listAgents();
|
|
8901
|
-
const
|
|
9073
|
+
const discoveredAgents = agents.filter((agent) => path3.resolve(agent.path) !== path3.resolve(paths.orchestratorAgentPath)).map((agent) => ({ kind: "agent", path: agent.path, name: agent.name }));
|
|
9074
|
+
const rosterRegistry = await presentItemsFor(runtime.port, staticItems.roster);
|
|
9075
|
+
const rosterItems = [...rosterRegistry, ...discoveredAgents];
|
|
8902
9076
|
const worktrees = await runtime.port.listWorktrees();
|
|
8903
9077
|
const worktreeItems = worktrees.map((worktree) => ({
|
|
8904
9078
|
kind: "worktree",
|
|
@@ -10051,6 +10225,15 @@ async function runCli(argv, deps) {
|
|
|
10051
10225
|
...defaultModel !== undefined ? { defaultModel } : {}
|
|
10052
10226
|
});
|
|
10053
10227
|
const legacyLayout = deps.detectLegacyLayout !== undefined ? await deps.detectLegacyLayout() : undefined;
|
|
10228
|
+
let gitignoreCoverage;
|
|
10229
|
+
if (deps.readGitignore !== undefined) {
|
|
10230
|
+
const raw = await deps.readGitignore();
|
|
10231
|
+
gitignoreCoverage = {
|
|
10232
|
+
path: OPENCODE_GITIGNORE_PATH,
|
|
10233
|
+
exists: raw !== undefined,
|
|
10234
|
+
missingRules: missingGeneratedStateRules(raw ?? "")
|
|
10235
|
+
};
|
|
10236
|
+
}
|
|
10054
10237
|
const otelBackend = describeOtelBackendForDoctor({
|
|
10055
10238
|
backend: "opentelemetry",
|
|
10056
10239
|
connectionEnv: "APPLICATIONINSIGHTS_CONNECTION_STRING"
|
|
@@ -10083,7 +10266,8 @@ async function runCli(argv, deps) {
|
|
|
10083
10266
|
...opencodeConfigError !== undefined ? { opencodeConfigError } : {},
|
|
10084
10267
|
...cacheEntries !== undefined ? { cacheEntries, cliVersion: deps.version } : {},
|
|
10085
10268
|
...legacyLayout !== undefined && legacyLayout.length > 0 ? { legacyLayout } : {},
|
|
10086
|
-
...otelBackend !== undefined ? { otelBackend } : {}
|
|
10269
|
+
...otelBackend !== undefined ? { otelBackend } : {},
|
|
10270
|
+
...gitignoreCoverage !== undefined ? { gitignore: gitignoreCoverage } : {}
|
|
10087
10271
|
})
|
|
10088
10272
|
};
|
|
10089
10273
|
}
|
|
@@ -10759,139 +10943,6 @@ function compareShadowRun(legacy, shadow) {
|
|
|
10759
10943
|
};
|
|
10760
10944
|
}
|
|
10761
10945
|
|
|
10762
|
-
// src/storage/graph/soakRecorder.ts
|
|
10763
|
-
async function ensureRecorderId(ports, basePath) {
|
|
10764
|
-
const idPath = `${basePath}/soak-recorder-id`;
|
|
10765
|
-
if (await ports.fs.exists(idPath)) {
|
|
10766
|
-
const id = (await ports.fs.readFile(idPath)).trim();
|
|
10767
|
-
if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/.test(id)) {
|
|
10768
|
-
return id;
|
|
10769
|
-
}
|
|
10770
|
-
}
|
|
10771
|
-
const newId = ports.id.randomUUID();
|
|
10772
|
-
await ports.fs.writeFile(idPath, newId);
|
|
10773
|
-
return newId;
|
|
10774
|
-
}
|
|
10775
|
-
async function readAllChains(ports, evidenceDir) {
|
|
10776
|
-
if (!await ports.fs.exists(evidenceDir)) {
|
|
10777
|
-
return { chains: [], rejectedLines: 0, rejections: [] };
|
|
10778
|
-
}
|
|
10779
|
-
const files = await ports.fs.readDir(evidenceDir);
|
|
10780
|
-
const chains = [];
|
|
10781
|
-
const rejections = [];
|
|
10782
|
-
for (const file of files) {
|
|
10783
|
-
if (!file.endsWith(".jsonl")) {
|
|
10784
|
-
continue;
|
|
10785
|
-
}
|
|
10786
|
-
const content = await ports.fs.readFile(`${evidenceDir}/${file}`);
|
|
10787
|
-
const lines = content.split(`
|
|
10788
|
-
`);
|
|
10789
|
-
const observations = [];
|
|
10790
|
-
for (const [index, line] of lines.entries()) {
|
|
10791
|
-
if (line.trim().length === 0) {
|
|
10792
|
-
continue;
|
|
10793
|
-
}
|
|
10794
|
-
const lineNumber = index + 1;
|
|
10795
|
-
let rawParsed;
|
|
10796
|
-
try {
|
|
10797
|
-
rawParsed = JSON.parse(line);
|
|
10798
|
-
} catch {
|
|
10799
|
-
rejections.push({ file, lineNumber, detail: "invalid JSON" });
|
|
10800
|
-
continue;
|
|
10801
|
-
}
|
|
10802
|
-
const parsed = SoakObservationSchema.safeParse(rawParsed);
|
|
10803
|
-
if (parsed.success) {
|
|
10804
|
-
observations.push(parsed.data);
|
|
10805
|
-
} else {
|
|
10806
|
-
rejections.push({
|
|
10807
|
-
file,
|
|
10808
|
-
lineNumber,
|
|
10809
|
-
detail: formatSoakObservationIssues(parsed.error.issues)
|
|
10810
|
-
});
|
|
10811
|
-
}
|
|
10812
|
-
}
|
|
10813
|
-
if (observations.length > 0) {
|
|
10814
|
-
chains.push(observations);
|
|
10815
|
-
}
|
|
10816
|
-
}
|
|
10817
|
-
return { chains, rejectedLines: rejections.length, rejections };
|
|
10818
|
-
}
|
|
10819
|
-
function formatSoakObservationIssues(issues) {
|
|
10820
|
-
return issues.map((i) => `${i.path.join(".")}: ${i.code}`).join("; ");
|
|
10821
|
-
}
|
|
10822
|
-
function canonicalObservationPreimage2(obs) {
|
|
10823
|
-
return JSON.stringify({
|
|
10824
|
-
version: obs.version,
|
|
10825
|
-
seq: obs.seq,
|
|
10826
|
-
timestamp: obs.timestamp,
|
|
10827
|
-
platform: obs.platform,
|
|
10828
|
-
opencodeVersion: obs.opencodeVersion,
|
|
10829
|
-
provenance: obs.provenance,
|
|
10830
|
-
traceDigest: obs.traceDigest,
|
|
10831
|
-
criticalDivergences: obs.criticalDivergences,
|
|
10832
|
-
privacy: obs.privacy,
|
|
10833
|
-
duplicateEffects: obs.duplicateEffects,
|
|
10834
|
-
modelVerification: obs.modelVerification
|
|
10835
|
-
});
|
|
10836
|
-
}
|
|
10837
|
-
async function appendObservation(ports, evidenceDir, recorderId, input) {
|
|
10838
|
-
if (input.opencodeVersion === "unknown") {
|
|
10839
|
-
throw new Error("opencode-version-unreadable");
|
|
10840
|
-
}
|
|
10841
|
-
await ports.fs.mkdir(evidenceDir);
|
|
10842
|
-
const chainPath = `${evidenceDir}/${recorderId}.jsonl`;
|
|
10843
|
-
let seq = 0;
|
|
10844
|
-
let prevChainDigest = "0".repeat(64);
|
|
10845
|
-
if (await ports.fs.exists(chainPath)) {
|
|
10846
|
-
const content = await ports.fs.readFile(chainPath);
|
|
10847
|
-
const lines = content.split(`
|
|
10848
|
-
`).filter((l) => l.trim().length > 0);
|
|
10849
|
-
if (lines.length > 0) {
|
|
10850
|
-
const lastLine = lines[lines.length - 1];
|
|
10851
|
-
let rawParsed;
|
|
10852
|
-
try {
|
|
10853
|
-
rawParsed = JSON.parse(lastLine);
|
|
10854
|
-
} catch {
|
|
10855
|
-
throw new Error("corrupt chain tail: invalid JSON");
|
|
10856
|
-
}
|
|
10857
|
-
const parsed = SoakObservationSchema.safeParse(rawParsed);
|
|
10858
|
-
if (!parsed.success) {
|
|
10859
|
-
const detail = parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.code}`).join("; ");
|
|
10860
|
-
throw new Error(`corrupt chain tail: ${detail}`);
|
|
10861
|
-
}
|
|
10862
|
-
seq = parsed.data.seq + 1;
|
|
10863
|
-
prevChainDigest = parsed.data.chainDigest;
|
|
10864
|
-
}
|
|
10865
|
-
}
|
|
10866
|
-
const timestamp = ports.clock.now();
|
|
10867
|
-
const base = {
|
|
10868
|
-
version: 1,
|
|
10869
|
-
seq,
|
|
10870
|
-
timestamp,
|
|
10871
|
-
platform: input.platform,
|
|
10872
|
-
opencodeVersion: input.opencodeVersion,
|
|
10873
|
-
provenance: input.provenance,
|
|
10874
|
-
traceDigest: input.traceDigest,
|
|
10875
|
-
criticalDivergences: input.criticalDivergences,
|
|
10876
|
-
privacy: input.privacy,
|
|
10877
|
-
duplicateEffects: input.duplicateEffects,
|
|
10878
|
-
modelVerification: input.modelVerification
|
|
10879
|
-
};
|
|
10880
|
-
const preimage = canonicalObservationPreimage2(base);
|
|
10881
|
-
const chainDigest = sha256Hex(prevChainDigest + preimage);
|
|
10882
|
-
const observation = { ...base, chainDigest };
|
|
10883
|
-
assertReferenceOnly(observation);
|
|
10884
|
-
const line = JSON.stringify(observation);
|
|
10885
|
-
if (await ports.fs.exists(chainPath)) {
|
|
10886
|
-
const existing = await ports.fs.readFile(chainPath);
|
|
10887
|
-
await ports.fs.writeFile(chainPath, `${existing}
|
|
10888
|
-
${line}`);
|
|
10889
|
-
} else {
|
|
10890
|
-
await ports.fs.writeFile(chainPath, line);
|
|
10891
|
-
}
|
|
10892
|
-
return observation;
|
|
10893
|
-
}
|
|
10894
|
-
|
|
10895
10946
|
// src/plugin/soakObserver.ts
|
|
10896
10947
|
function resolvePlatform(platform) {
|
|
10897
10948
|
if (platform === "win32")
|
|
@@ -13036,7 +13087,7 @@ var createOtlpSpanExporter = (connection, config) => {
|
|
|
13036
13087
|
// package.json
|
|
13037
13088
|
var package_default = {
|
|
13038
13089
|
name: "@jmanuelcorral/openteam",
|
|
13039
|
-
version: "0.13.
|
|
13090
|
+
version: "0.13.1",
|
|
13040
13091
|
packageManager: "bun@1.3.14",
|
|
13041
13092
|
description: "Cost-aware, local-first routing plugin for opencode with cheapest-capable frontier fallback and multi-agent orchestration.",
|
|
13042
13093
|
license: "MIT",
|
|
@@ -13212,7 +13263,6 @@ function warnSoakEvidenceRejections(result, warn) {
|
|
|
13212
13263
|
var SHADOW_CERT_PATH = "artifacts/graph-shadow-certificate.json";
|
|
13213
13264
|
var RELEASE_CERT_PATH = "artifacts/graph-release-certificate.json";
|
|
13214
13265
|
var SOAK_CERT_PATH = "artifacts/graph-soak-certificate.json";
|
|
13215
|
-
var SOAK_EVIDENCE_DIR = ".opencode/soak";
|
|
13216
13266
|
async function readAndParseCertificate(storage, path4, parse2, digestExtractor) {
|
|
13217
13267
|
try {
|
|
13218
13268
|
const content = await storage.read(path4);
|
|
@@ -13735,14 +13785,14 @@ var server = async (ctx, rawOptions) => {
|
|
|
13735
13785
|
let shadowDeps;
|
|
13736
13786
|
if (graphConfig.effectiveMode !== "off") {
|
|
13737
13787
|
const recorderPorts = recorderPortsFromStorage(storage);
|
|
13738
|
-
const recorderId = await ensureRecorderId(recorderPorts,
|
|
13788
|
+
const recorderId = await ensureRecorderId(recorderPorts, SOAK_RECORDER_BASE_DIR);
|
|
13739
13789
|
shadowDeps = {
|
|
13740
13790
|
gate: {
|
|
13741
13791
|
mode: graphConfig.configuredMode,
|
|
13742
13792
|
killSwitch: graphConfig.killSwitch
|
|
13743
13793
|
},
|
|
13744
13794
|
ports: recorderPorts,
|
|
13745
|
-
evidenceDir:
|
|
13795
|
+
evidenceDir: SOAK_EVIDENCE_DIR,
|
|
13746
13796
|
recorderId,
|
|
13747
13797
|
resolveOpencodeVersion: getOpencodeVersion,
|
|
13748
13798
|
criticalCodes: DEFAULT_SOAK_POLICY.criticalDivergenceCodes
|
|
@@ -31,6 +31,25 @@ export type RecorderPorts = {
|
|
|
31
31
|
export type SoakChainReadPorts = {
|
|
32
32
|
readonly fs: Pick<FsPort, "readFile" | "exists" | "readDir">;
|
|
33
33
|
};
|
|
34
|
+
/**
|
|
35
|
+
* Directory (relative to cwd) the shadow soak pipeline writes its JSONL evidence
|
|
36
|
+
* chains to. Exported so `openteam setup`'s ignore-rule derivation and the plugin
|
|
37
|
+
* writer in `src/index.ts` share one literal and can never drift apart (the drift
|
|
38
|
+
* that left these recordings unignored in consuming projects).
|
|
39
|
+
*/
|
|
40
|
+
export declare const SOAK_EVIDENCE_DIR = ".opencode/soak";
|
|
41
|
+
/**
|
|
42
|
+
* Base directory that holds the machine-local recorder id file. Passed to
|
|
43
|
+
* {@link ensureRecorderId} as `basePath`.
|
|
44
|
+
*/
|
|
45
|
+
export declare const SOAK_RECORDER_BASE_DIR = ".opencode";
|
|
46
|
+
/** Filename of the machine-local recorder id, stored under {@link SOAK_RECORDER_BASE_DIR}. */
|
|
47
|
+
export declare const SOAK_RECORDER_ID_FILENAME = "soak-recorder-id";
|
|
48
|
+
/**
|
|
49
|
+
* Full path (relative to cwd) of the machine-local recorder id file. Exported so
|
|
50
|
+
* the ignore-rule derivation covers it alongside {@link SOAK_EVIDENCE_DIR}.
|
|
51
|
+
*/
|
|
52
|
+
export declare const SOAK_RECORDER_ID_PATH = ".opencode/soak-recorder-id";
|
|
34
53
|
export type SoakObservationLineRejection = {
|
|
35
54
|
readonly file: string;
|
|
36
55
|
readonly lineNumber: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"soakRecorder.d.ts","sourceRoot":"","sources":["../../../src/storage/graph/soakRecorder.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,eAAe,EAEpB,KAAK,YAAY,EACjB,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAC;AAEhC;;;;;;GAMG;AAMH,8DAA8D;AAC9D,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IAC/D,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD,CAAC;AAEF,uCAAuC;AACvC,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;CAC5B,CAAC;AAEF,kCAAkC;AAClC,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,UAAU,EAAE,MAAM,MAAM,CAAC;CACnC,CAAC;AAEF,2CAA2C;AAC3C,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC;CAC9D,CAAC;
|
|
1
|
+
{"version":3,"file":"soakRecorder.d.ts","sourceRoot":"","sources":["../../../src/storage/graph/soakRecorder.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jmanuelcorral/openteam",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.1",
|
|
4
4
|
"packageManager": "bun@1.3.14",
|
|
5
5
|
"description": "Cost-aware, local-first routing plugin for opencode with cheapest-capable frontier fallback and multi-agent orchestration.",
|
|
6
6
|
"license": "MIT",
|