@soleri/core 9.7.2 → 9.9.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/dist/brain/intelligence.d.ts.map +1 -1
- package/dist/brain/intelligence.js +11 -2
- package/dist/brain/intelligence.js.map +1 -1
- package/dist/brain/types.d.ts +1 -0
- package/dist/brain/types.d.ts.map +1 -1
- package/dist/enforcement/adapters/index.d.ts +15 -0
- package/dist/enforcement/adapters/index.d.ts.map +1 -1
- package/dist/enforcement/adapters/index.js +38 -0
- package/dist/enforcement/adapters/index.js.map +1 -1
- package/dist/enforcement/adapters/opencode.d.ts +21 -0
- package/dist/enforcement/adapters/opencode.d.ts.map +1 -0
- package/dist/enforcement/adapters/opencode.js +115 -0
- package/dist/enforcement/adapters/opencode.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/paths.d.ts +2 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +4 -0
- package/dist/paths.js.map +1 -1
- package/dist/planning/evidence-collector.d.ts +2 -0
- package/dist/planning/evidence-collector.d.ts.map +1 -1
- package/dist/planning/evidence-collector.js +7 -2
- package/dist/planning/evidence-collector.js.map +1 -1
- package/dist/planning/gap-patterns.d.ts.map +1 -1
- package/dist/planning/gap-patterns.js +4 -1
- package/dist/planning/gap-patterns.js.map +1 -1
- package/dist/planning/plan-lifecycle.d.ts.map +1 -1
- package/dist/planning/plan-lifecycle.js +5 -0
- package/dist/planning/plan-lifecycle.js.map +1 -1
- package/dist/planning/planner-types.d.ts +2 -0
- package/dist/planning/planner-types.d.ts.map +1 -1
- package/dist/runtime/capture-ops.d.ts.map +1 -1
- package/dist/runtime/capture-ops.js +14 -6
- package/dist/runtime/capture-ops.js.map +1 -1
- package/dist/runtime/facades/curator-facade.d.ts.map +1 -1
- package/dist/runtime/facades/curator-facade.js +52 -4
- package/dist/runtime/facades/curator-facade.js.map +1 -1
- package/dist/runtime/orchestrate-ops.d.ts +12 -0
- package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
- package/dist/runtime/orchestrate-ops.js +141 -1
- package/dist/runtime/orchestrate-ops.js.map +1 -1
- package/dist/runtime/quality-signals.d.ts +42 -0
- package/dist/runtime/quality-signals.d.ts.map +1 -0
- package/dist/runtime/quality-signals.js +124 -0
- package/dist/runtime/quality-signals.js.map +1 -0
- package/dist/skills/trust-classifier.js +1 -1
- package/dist/skills/trust-classifier.js.map +1 -1
- package/dist/vault/vault-markdown-sync.d.ts +5 -2
- package/dist/vault/vault-markdown-sync.d.ts.map +1 -1
- package/dist/vault/vault-markdown-sync.js +13 -2
- package/dist/vault/vault-markdown-sync.js.map +1 -1
- package/dist/workflows/index.d.ts +6 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +5 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/workflow-loader.d.ts +83 -0
- package/dist/workflows/workflow-loader.d.ts.map +1 -0
- package/dist/workflows/workflow-loader.js +207 -0
- package/dist/workflows/workflow-loader.js.map +1 -0
- package/package.json +1 -1
- package/src/brain/intelligence.ts +15 -2
- package/src/brain/types.ts +1 -0
- package/src/enforcement/adapters/index.ts +45 -0
- package/src/enforcement/adapters/opencode.test.ts +406 -0
- package/src/enforcement/adapters/opencode.ts +153 -0
- package/src/index.ts +19 -0
- package/src/paths.ts +5 -0
- package/src/planning/evidence-collector.test.ts +95 -0
- package/src/planning/evidence-collector.ts +11 -0
- package/src/planning/gap-patterns.ts +7 -3
- package/src/planning/plan-lifecycle.test.ts +49 -0
- package/src/planning/plan-lifecycle.ts +5 -0
- package/src/planning/planner-types.ts +2 -0
- package/src/runtime/capture-ops.test.ts +58 -1
- package/src/runtime/capture-ops.ts +15 -4
- package/src/runtime/facades/curator-facade.test.ts +87 -9
- package/src/runtime/facades/curator-facade.ts +60 -4
- package/src/runtime/orchestrate-ops.test.ts +78 -1
- package/src/runtime/orchestrate-ops.ts +175 -1
- package/src/runtime/orchestrate-status-readiness.test.ts +162 -0
- package/src/runtime/quality-signals.test.ts +312 -0
- package/src/runtime/quality-signals.ts +169 -0
- package/src/skills/trust-classifier.ts +1 -1
- package/src/vault/vault-markdown-sync.test.ts +40 -0
- package/src/vault/vault-markdown-sync.ts +16 -3
- package/src/workflows/index.ts +12 -0
- package/src/workflows/orchestrate-integration.test.ts +166 -0
- package/src/workflows/workflow-loader.test.ts +149 -0
- package/src/workflows/workflow-loader.ts +238 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault-markdown-sync.d.ts","sourceRoot":"","sources":["../../src/vault/vault-markdown-sync.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAIxC,6CAA6C;AAC7C,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CA+ChE;AAID
|
|
1
|
+
{"version":3,"file":"vault-markdown-sync.d.ts","sourceRoot":"","sources":["../../src/vault/vault-markdown-sync.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAIxC,6CAA6C;AAC7C,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CA+ChE;AAID;uFACuF;AACvF,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,iBAAiB,EACxB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAuB/B;AAED,uFAAuF;AACvF,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA6B9C;AAID,uDAAuD;AACvD,wBAAsB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BvE"}
|
|
@@ -72,17 +72,28 @@ export function entryToMarkdown(entry) {
|
|
|
72
72
|
return lines.join('\n');
|
|
73
73
|
}
|
|
74
74
|
// ─── Sync ───────────────────────────────────────────────────────────
|
|
75
|
-
/** Write a single entry as a markdown file to knowledge/vault/{domain}/{slug}.md
|
|
75
|
+
/** Write a single entry as a markdown file to knowledge/vault/{domain}/{slug}.md.
|
|
76
|
+
* Skips the write if the file already exists with a matching content hash (dedup). */
|
|
76
77
|
export async function syncEntryToMarkdown(entry, knowledgeDir) {
|
|
77
78
|
const domain = entry.domain || '_general';
|
|
78
79
|
const slug = titleToSlug(entry.title);
|
|
79
80
|
if (!slug)
|
|
80
|
-
return;
|
|
81
|
+
return { written: false };
|
|
81
82
|
const dir = join(knowledgeDir, 'vault', domain);
|
|
82
83
|
mkdirSync(dir, { recursive: true });
|
|
83
84
|
const filePath = join(dir, `${slug}.md`);
|
|
85
|
+
// Content-hash dedup: skip rewrite when file content hasn't changed
|
|
86
|
+
const contentHash = computeContentHash(entry);
|
|
87
|
+
if (existsSync(filePath)) {
|
|
88
|
+
const existing = readFileSync(filePath, 'utf-8');
|
|
89
|
+
const hashMatch = existing.match(/^content_hash:\s*"([^"]+)"/m);
|
|
90
|
+
if (hashMatch && hashMatch[1] === contentHash) {
|
|
91
|
+
return { written: false };
|
|
92
|
+
}
|
|
93
|
+
}
|
|
84
94
|
const content = entryToMarkdown(entry);
|
|
85
95
|
writeFileSync(filePath, content, 'utf-8');
|
|
96
|
+
return { written: true };
|
|
86
97
|
}
|
|
87
98
|
/** Sync all vault entries to markdown, skipping entries whose content hash matches. */
|
|
88
99
|
export async function syncAllToMarkdown(vault, knowledgeDir) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault-markdown-sync.js","sourceRoot":"","sources":["../../src/vault/vault-markdown-sync.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"vault-markdown-sync.js","sourceRoot":"","sources":["../../src/vault/vault-markdown-sync.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGvD,uEAAuE;AAEvE,6CAA6C;AAC7C,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,eAAe,CAAC,KAAwB;IACtD,MAAM,KAAK,GAAa,CAAC,KAAK,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;IAChE,IAAI,KAAK,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;IACpD,IAAI,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS;QAC7B,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC7D,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1C,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;IAClC,KAAK,CAAC,IAAI,CAAC,kBAAkB,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,uEAAuE;AAEvE;uFACuF;AACvF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAwB,EACxB,YAAoB;IAEpB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,UAAU,CAAC;IAC1C,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAErC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAChD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;IAEzC,oEAAoE;IACpE,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAChE,IAAI,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;YAC9C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACvC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAY,EACZ,YAAoB;IAEpB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,UAAU,CAAC;QAC1C,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;QACnE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAChE,IAAI,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5D,OAAO,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;QACH,CAAC;QAED,MAAM,mBAAmB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAC/C,MAAM,EAAE,CAAC;IACX,CAAC;IAED,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAED,uEAAuE;AAEvE,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,YAAoB;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO;IAElC,MAAM,OAAO,GAA2C,EAAE,CAAC;IAC3D,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAE3D,MAAM,KAAK,GAAa;QACtB,yBAAyB;QACzB,EAAE;QACF,qBAAqB,KAAK,mBAAmB,OAAO,CAAC,MAAM,WAAW;QACtE,EAAE;QACF,sBAAsB;QACtB,sBAAsB;QACtB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,KAAK,IAAI,CAAC;QACnE,EAAE;KACH,CAAC;IAEF,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow overrides — barrel export.
|
|
3
|
+
*/
|
|
4
|
+
export { loadAgentWorkflows, getWorkflowForIntent, WORKFLOW_TO_INTENT, WorkflowGateSchema, WorkflowOverrideSchema, } from './workflow-loader.js';
|
|
5
|
+
export type { WorkflowGate, WorkflowOverride } from './workflow-loader.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow loader — reads agent workflow overrides from the file tree.
|
|
3
|
+
*
|
|
4
|
+
* Each workflow is a folder under `workflows/` containing:
|
|
5
|
+
* - `prompt.md` — system prompt for the workflow (optional)
|
|
6
|
+
* - `gates.yaml` — gate definitions (optional)
|
|
7
|
+
* - `tools.yaml` — tool allowlist (optional)
|
|
8
|
+
*
|
|
9
|
+
* These overrides are merged into the OrchestrationPlan when
|
|
10
|
+
* the detected intent matches a workflow via WORKFLOW_TO_INTENT.
|
|
11
|
+
*/
|
|
12
|
+
import { z } from 'zod';
|
|
13
|
+
export declare const WorkflowGateSchema: z.ZodObject<{
|
|
14
|
+
phase: z.ZodString;
|
|
15
|
+
requirement: z.ZodString;
|
|
16
|
+
check: z.ZodString;
|
|
17
|
+
}, "strip", z.ZodTypeAny, {
|
|
18
|
+
check: string;
|
|
19
|
+
phase: string;
|
|
20
|
+
requirement: string;
|
|
21
|
+
}, {
|
|
22
|
+
check: string;
|
|
23
|
+
phase: string;
|
|
24
|
+
requirement: string;
|
|
25
|
+
}>;
|
|
26
|
+
export declare const WorkflowOverrideSchema: z.ZodObject<{
|
|
27
|
+
name: z.ZodString;
|
|
28
|
+
prompt: z.ZodOptional<z.ZodString>;
|
|
29
|
+
gates: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
30
|
+
phase: z.ZodString;
|
|
31
|
+
requirement: z.ZodString;
|
|
32
|
+
check: z.ZodString;
|
|
33
|
+
}, "strip", z.ZodTypeAny, {
|
|
34
|
+
check: string;
|
|
35
|
+
phase: string;
|
|
36
|
+
requirement: string;
|
|
37
|
+
}, {
|
|
38
|
+
check: string;
|
|
39
|
+
phase: string;
|
|
40
|
+
requirement: string;
|
|
41
|
+
}>, "many">>;
|
|
42
|
+
tools: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
43
|
+
}, "strip", z.ZodTypeAny, {
|
|
44
|
+
name: string;
|
|
45
|
+
tools: string[];
|
|
46
|
+
gates: {
|
|
47
|
+
check: string;
|
|
48
|
+
phase: string;
|
|
49
|
+
requirement: string;
|
|
50
|
+
}[];
|
|
51
|
+
prompt?: string | undefined;
|
|
52
|
+
}, {
|
|
53
|
+
name: string;
|
|
54
|
+
prompt?: string | undefined;
|
|
55
|
+
tools?: string[] | undefined;
|
|
56
|
+
gates?: {
|
|
57
|
+
check: string;
|
|
58
|
+
phase: string;
|
|
59
|
+
requirement: string;
|
|
60
|
+
}[] | undefined;
|
|
61
|
+
}>;
|
|
62
|
+
export type WorkflowGate = z.infer<typeof WorkflowGateSchema>;
|
|
63
|
+
export type WorkflowOverride = z.infer<typeof WorkflowOverrideSchema>;
|
|
64
|
+
/**
|
|
65
|
+
* Maps workflow folder names to intent strings.
|
|
66
|
+
* Used by `getWorkflowForIntent()` to find a matching workflow.
|
|
67
|
+
*/
|
|
68
|
+
export declare const WORKFLOW_TO_INTENT: Record<string, string>;
|
|
69
|
+
/**
|
|
70
|
+
* Load all workflow overrides from an agent's `workflows/` directory.
|
|
71
|
+
*
|
|
72
|
+
* Returns an empty Map if the directory doesn't exist or can't be read
|
|
73
|
+
* (graceful degradation — no throw).
|
|
74
|
+
*/
|
|
75
|
+
export declare function loadAgentWorkflows(workflowsDir: string): Map<string, WorkflowOverride>;
|
|
76
|
+
/**
|
|
77
|
+
* Find a workflow override that matches the given intent.
|
|
78
|
+
*
|
|
79
|
+
* Uses WORKFLOW_TO_INTENT mapping, optionally overridden by customMapping.
|
|
80
|
+
* Returns null if no matching workflow is found.
|
|
81
|
+
*/
|
|
82
|
+
export declare function getWorkflowForIntent(workflows: Map<string, WorkflowOverride>, intent: string, customMapping?: Record<string, string>): WorkflowOverride | null;
|
|
83
|
+
//# sourceMappingURL=workflow-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-loader.d.ts","sourceRoot":"","sources":["../../src/workflows/workflow-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKjC,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAMtE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOrD,CAAC;AAMF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CA2DtF;AAMD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACxC,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC,gBAAgB,GAAG,IAAI,CAWzB"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow loader — reads agent workflow overrides from the file tree.
|
|
3
|
+
*
|
|
4
|
+
* Each workflow is a folder under `workflows/` containing:
|
|
5
|
+
* - `prompt.md` — system prompt for the workflow (optional)
|
|
6
|
+
* - `gates.yaml` — gate definitions (optional)
|
|
7
|
+
* - `tools.yaml` — tool allowlist (optional)
|
|
8
|
+
*
|
|
9
|
+
* These overrides are merged into the OrchestrationPlan when
|
|
10
|
+
* the detected intent matches a workflow via WORKFLOW_TO_INTENT.
|
|
11
|
+
*/
|
|
12
|
+
import fs from 'node:fs';
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Schemas
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
export const WorkflowGateSchema = z.object({
|
|
19
|
+
phase: z.string(),
|
|
20
|
+
requirement: z.string(),
|
|
21
|
+
check: z.string(),
|
|
22
|
+
});
|
|
23
|
+
export const WorkflowOverrideSchema = z.object({
|
|
24
|
+
name: z.string(),
|
|
25
|
+
prompt: z.string().optional(),
|
|
26
|
+
gates: z.array(WorkflowGateSchema).default([]),
|
|
27
|
+
tools: z.array(z.string()).default([]),
|
|
28
|
+
});
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// Workflow → Intent mapping
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
/**
|
|
33
|
+
* Maps workflow folder names to intent strings.
|
|
34
|
+
* Used by `getWorkflowForIntent()` to find a matching workflow.
|
|
35
|
+
*/
|
|
36
|
+
export const WORKFLOW_TO_INTENT = {
|
|
37
|
+
'feature-dev': 'BUILD',
|
|
38
|
+
'bug-fix': 'FIX',
|
|
39
|
+
'code-review': 'REVIEW',
|
|
40
|
+
'component-build': 'BUILD',
|
|
41
|
+
'token-migration': 'ENHANCE',
|
|
42
|
+
'a11y-remediation': 'FIX',
|
|
43
|
+
};
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Loader
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
/**
|
|
48
|
+
* Load all workflow overrides from an agent's `workflows/` directory.
|
|
49
|
+
*
|
|
50
|
+
* Returns an empty Map if the directory doesn't exist or can't be read
|
|
51
|
+
* (graceful degradation — no throw).
|
|
52
|
+
*/
|
|
53
|
+
export function loadAgentWorkflows(workflowsDir) {
|
|
54
|
+
const workflows = new Map();
|
|
55
|
+
let entries;
|
|
56
|
+
try {
|
|
57
|
+
entries = fs.readdirSync(workflowsDir);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Directory doesn't exist or can't be read — that's fine
|
|
61
|
+
return workflows;
|
|
62
|
+
}
|
|
63
|
+
for (const entry of entries) {
|
|
64
|
+
const fullPath = path.join(workflowsDir, entry);
|
|
65
|
+
let stat;
|
|
66
|
+
try {
|
|
67
|
+
stat = fs.statSync(fullPath);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (!stat.isDirectory())
|
|
73
|
+
continue;
|
|
74
|
+
const override = { name: entry, gates: [], tools: [] };
|
|
75
|
+
// Read prompt.md
|
|
76
|
+
const promptPath = path.join(fullPath, 'prompt.md');
|
|
77
|
+
try {
|
|
78
|
+
override.prompt = fs.readFileSync(promptPath, 'utf-8').trim();
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// No prompt — that's fine
|
|
82
|
+
}
|
|
83
|
+
// Read gates.yaml
|
|
84
|
+
const gatesPath = path.join(fullPath, 'gates.yaml');
|
|
85
|
+
try {
|
|
86
|
+
const raw = fs.readFileSync(gatesPath, 'utf-8');
|
|
87
|
+
// Simple YAML parsing for the gates structure
|
|
88
|
+
const gates = parseGatesYaml(raw);
|
|
89
|
+
override.gates = gates;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// No gates — that's fine
|
|
93
|
+
}
|
|
94
|
+
// Read tools.yaml
|
|
95
|
+
const toolsPath = path.join(fullPath, 'tools.yaml');
|
|
96
|
+
try {
|
|
97
|
+
const raw = fs.readFileSync(toolsPath, 'utf-8');
|
|
98
|
+
const tools = parseToolsYaml(raw);
|
|
99
|
+
override.tools = tools;
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// No tools — that's fine
|
|
103
|
+
}
|
|
104
|
+
// Only store if we got something useful
|
|
105
|
+
if (override.prompt || override.gates.length > 0 || override.tools.length > 0) {
|
|
106
|
+
workflows.set(entry, override);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return workflows;
|
|
110
|
+
}
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
// Intent matching
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
/**
|
|
115
|
+
* Find a workflow override that matches the given intent.
|
|
116
|
+
*
|
|
117
|
+
* Uses WORKFLOW_TO_INTENT mapping, optionally overridden by customMapping.
|
|
118
|
+
* Returns null if no matching workflow is found.
|
|
119
|
+
*/
|
|
120
|
+
export function getWorkflowForIntent(workflows, intent, customMapping) {
|
|
121
|
+
const mapping = customMapping ?? WORKFLOW_TO_INTENT;
|
|
122
|
+
const normalizedIntent = intent.toUpperCase();
|
|
123
|
+
for (const [workflowName, mappedIntent] of Object.entries(mapping)) {
|
|
124
|
+
if (mappedIntent.toUpperCase() === normalizedIntent && workflows.has(workflowName)) {
|
|
125
|
+
return workflows.get(workflowName);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
// Minimal YAML parsers (no external dependency)
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
/**
|
|
134
|
+
* Parse a simple gates.yaml file. Expected format:
|
|
135
|
+
*
|
|
136
|
+
* ```yaml
|
|
137
|
+
* gates:
|
|
138
|
+
* - phase: brainstorming
|
|
139
|
+
* requirement: Requirements are clear
|
|
140
|
+
* check: user-approval
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
function parseGatesYaml(raw) {
|
|
144
|
+
const gates = [];
|
|
145
|
+
const lines = raw.split('\n');
|
|
146
|
+
let current = null;
|
|
147
|
+
for (const line of lines) {
|
|
148
|
+
const trimmed = line.trim();
|
|
149
|
+
// Skip empty lines and the root "gates:" key
|
|
150
|
+
if (!trimmed || trimmed === 'gates:')
|
|
151
|
+
continue;
|
|
152
|
+
// New list item
|
|
153
|
+
if (trimmed.startsWith('- ')) {
|
|
154
|
+
if (current && current.phase && current.requirement && current.check) {
|
|
155
|
+
gates.push(current);
|
|
156
|
+
}
|
|
157
|
+
current = {};
|
|
158
|
+
// Parse inline key from "- phase: value"
|
|
159
|
+
const inlineMatch = trimmed.match(/^-\s+(\w+):\s*(.+)$/);
|
|
160
|
+
if (inlineMatch) {
|
|
161
|
+
const [, key, value] = inlineMatch;
|
|
162
|
+
if (key === 'phase' || key === 'requirement' || key === 'check') {
|
|
163
|
+
current[key] = value.trim();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
// Continuation key: " requirement: value"
|
|
169
|
+
if (current) {
|
|
170
|
+
const kvMatch = trimmed.match(/^(\w+):\s*(.+)$/);
|
|
171
|
+
if (kvMatch) {
|
|
172
|
+
const [, key, value] = kvMatch;
|
|
173
|
+
if (key === 'phase' || key === 'requirement' || key === 'check') {
|
|
174
|
+
current[key] = value.trim();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Flush last entry
|
|
180
|
+
if (current && current.phase && current.requirement && current.check) {
|
|
181
|
+
gates.push(current);
|
|
182
|
+
}
|
|
183
|
+
return gates;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Parse a simple tools.yaml file. Expected format:
|
|
187
|
+
*
|
|
188
|
+
* ```yaml
|
|
189
|
+
* tools:
|
|
190
|
+
* - soleri_vault op:search_intelligent
|
|
191
|
+
* - soleri_plan op:create_plan
|
|
192
|
+
* ```
|
|
193
|
+
*/
|
|
194
|
+
function parseToolsYaml(raw) {
|
|
195
|
+
const tools = [];
|
|
196
|
+
const lines = raw.split('\n');
|
|
197
|
+
for (const line of lines) {
|
|
198
|
+
const trimmed = line.trim();
|
|
199
|
+
if (!trimmed || trimmed === 'tools:')
|
|
200
|
+
continue;
|
|
201
|
+
if (trimmed.startsWith('- ')) {
|
|
202
|
+
tools.push(trimmed.slice(2).trim());
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return tools;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=workflow-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-loader.js","sourceRoot":"","sources":["../../src/workflows/workflow-loader.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -36,6 +36,8 @@ import type {
|
|
|
36
36
|
const USAGE_MAX = 10;
|
|
37
37
|
const SPREAD_MAX = 5;
|
|
38
38
|
const RECENCY_DECAY_DAYS = 30;
|
|
39
|
+
const STRENGTH_HALFLIFE_DAYS = 90;
|
|
40
|
+
const STRENGTH_DECAY_FLOOR = 0.3;
|
|
39
41
|
const EXTRACTION_TOOL_THRESHOLD = 3;
|
|
40
42
|
const EXTRACTION_FILE_THRESHOLD = 3;
|
|
41
43
|
const EXTRACTION_HIGH_FEEDBACK_RATIO = 0.8;
|
|
@@ -554,11 +556,21 @@ export class BrainIntelligence {
|
|
|
554
556
|
const successScore = 25 * successRate;
|
|
555
557
|
|
|
556
558
|
// Recency score: max(0, 25 * (1 - daysSince / RECENCY_DECAY_DAYS))
|
|
557
|
-
|
|
559
|
+
// last_used is MAX(created_at) which is unixepoch() (seconds) — convert to ms
|
|
560
|
+
const lastUsedRaw = Number(row.last_used);
|
|
561
|
+
const lastUsedMs = lastUsedRaw < 1e12 ? lastUsedRaw * 1000 : lastUsedRaw;
|
|
558
562
|
const daysSince = (now - lastUsedMs) / (1000 * 60 * 60 * 24);
|
|
559
563
|
const recencyScore = Math.max(0, 25 * (1 - daysSince / RECENCY_DECAY_DAYS));
|
|
560
564
|
|
|
561
|
-
const
|
|
565
|
+
const rawStrength = usageScore + spreadScore + successScore + recencyScore;
|
|
566
|
+
|
|
567
|
+
// Temporal decay multiplier: exponential halflife with floor
|
|
568
|
+
// Patterns fade over time but never vanish completely
|
|
569
|
+
const temporalMultiplier = Math.max(
|
|
570
|
+
STRENGTH_DECAY_FLOOR,
|
|
571
|
+
Math.exp((-Math.LN2 * daysSince) / STRENGTH_HALFLIFE_DAYS),
|
|
572
|
+
);
|
|
573
|
+
const strength = rawStrength * temporalMultiplier;
|
|
562
574
|
|
|
563
575
|
const ps: PatternStrength = {
|
|
564
576
|
pattern,
|
|
@@ -568,6 +580,7 @@ export class BrainIntelligence {
|
|
|
568
580
|
spreadScore,
|
|
569
581
|
successScore,
|
|
570
582
|
recencyScore,
|
|
583
|
+
temporalMultiplier,
|
|
571
584
|
usageCount: row.total,
|
|
572
585
|
uniqueContexts,
|
|
573
586
|
successRate,
|
package/src/brain/types.ts
CHANGED
|
@@ -1 +1,46 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import type { HostAdapter } from '../types.js';
|
|
5
|
+
import { ClaudeCodeAdapter } from './claude-code.js';
|
|
6
|
+
import { OpenCodeAdapter } from './opencode.js';
|
|
7
|
+
|
|
1
8
|
export { ClaudeCodeAdapter } from './claude-code.js';
|
|
9
|
+
export { OpenCodeAdapter } from './opencode.js';
|
|
10
|
+
|
|
11
|
+
export type DetectedHost = 'claude-code' | 'opencode' | 'unknown';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Detect which AI coding host is running.
|
|
15
|
+
*
|
|
16
|
+
* Checks environment variables and well-known config paths.
|
|
17
|
+
* Defaults to 'claude-code' for backward compatibility when
|
|
18
|
+
* both or neither host is detected.
|
|
19
|
+
*/
|
|
20
|
+
export function detectHost(): DetectedHost {
|
|
21
|
+
const home = homedir();
|
|
22
|
+
|
|
23
|
+
// Check for OpenCode
|
|
24
|
+
const isOpenCode =
|
|
25
|
+
!!process.env.OPENCODE ||
|
|
26
|
+
!!process.env.OPENCODE_SESSION ||
|
|
27
|
+
existsSync(join(home, '.config', 'opencode', 'opencode.json'));
|
|
28
|
+
|
|
29
|
+
// Check for Claude Code
|
|
30
|
+
const isClaudeCode = !!process.env.CLAUDE_CODE || existsSync(join(home, '.claude'));
|
|
31
|
+
|
|
32
|
+
if (isOpenCode && !isClaudeCode) return 'opencode';
|
|
33
|
+
if (isOpenCode && isClaudeCode) return 'claude-code'; // both → default
|
|
34
|
+
if (!isOpenCode && !isClaudeCode) return 'claude-code'; // neither → default
|
|
35
|
+
|
|
36
|
+
return 'claude-code';
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Create the appropriate host adapter for the detected environment.
|
|
41
|
+
*/
|
|
42
|
+
export function createHostAdapter(): HostAdapter {
|
|
43
|
+
const host = detectHost();
|
|
44
|
+
if (host === 'opencode') return new OpenCodeAdapter();
|
|
45
|
+
return new ClaudeCodeAdapter();
|
|
46
|
+
}
|