@zihanw/pi-forge 0.4.1 → 0.5.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/CHANGELOG.md +79 -1
- package/README.md +12 -11
- package/README.zh-CN.md +3 -5
- package/SUBAGENT_ADAPTER_CONTRACT.md +3 -1
- package/dist/agent-profile.d.ts +18 -62
- package/dist/agent-profile.d.ts.map +1 -1
- package/dist/agent-profile.js +27 -249
- package/dist/agent-profile.js.map +1 -1
- package/dist/codecs/agent-profile.d.ts +53 -0
- package/dist/codecs/agent-profile.d.ts.map +1 -0
- package/dist/codecs/agent-profile.js +176 -0
- package/dist/codecs/agent-profile.js.map +1 -0
- package/dist/codecs/index.d.ts +5 -0
- package/dist/codecs/index.d.ts.map +1 -0
- package/dist/codecs/index.js +3 -0
- package/dist/codecs/index.js.map +1 -0
- package/dist/codecs/prompt-stack.d.ts +18 -0
- package/dist/codecs/prompt-stack.d.ts.map +1 -0
- package/dist/codecs/prompt-stack.js +479 -0
- package/dist/codecs/prompt-stack.js.map +1 -0
- package/dist/compile-cycle.d.ts +18 -0
- package/dist/compile-cycle.d.ts.map +1 -0
- package/dist/compile-cycle.js +13 -0
- package/dist/compile-cycle.js.map +1 -0
- package/dist/compiler.d.ts +10 -4
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +53 -19
- package/dist/compiler.js.map +1 -1
- package/dist/context-diff-history.d.ts +61 -0
- package/dist/context-diff-history.d.ts.map +1 -0
- package/dist/context-diff-history.js +84 -0
- package/dist/context-diff-history.js.map +1 -0
- package/dist/context-diff-snapshot.d.ts +19 -0
- package/dist/context-diff-snapshot.d.ts.map +1 -0
- package/dist/context-diff-snapshot.js +146 -0
- package/dist/context-diff-snapshot.js.map +1 -0
- package/dist/context-diff.d.ts +70 -0
- package/dist/context-diff.d.ts.map +1 -0
- package/dist/context-diff.js +259 -0
- package/dist/context-diff.js.map +1 -0
- package/dist/extension-registry.d.ts.map +1 -1
- package/dist/extension-registry.js +5 -2
- package/dist/extension-registry.js.map +1 -1
- package/dist/forge-config.d.ts +0 -105
- package/dist/forge-config.d.ts.map +1 -1
- package/dist/forge-config.js +1 -313
- package/dist/forge-config.js.map +1 -1
- package/dist/forge-v1/analyzer.d.ts +3 -0
- package/dist/forge-v1/analyzer.d.ts.map +1 -0
- package/dist/forge-v1/analyzer.js +50 -0
- package/dist/forge-v1/analyzer.js.map +1 -0
- package/dist/forge-v1/index.d.ts +6 -0
- package/dist/forge-v1/index.d.ts.map +1 -0
- package/dist/forge-v1/index.js +13 -0
- package/dist/forge-v1/index.js.map +1 -0
- package/dist/forge-v1/parser.d.ts +3 -0
- package/dist/forge-v1/parser.d.ts.map +1 -0
- package/dist/forge-v1/parser.js +186 -0
- package/dist/forge-v1/parser.js.map +1 -0
- package/dist/forge-v1/renderer.d.ts +9 -0
- package/dist/forge-v1/renderer.d.ts.map +1 -0
- package/dist/forge-v1/renderer.js +181 -0
- package/dist/forge-v1/renderer.js.map +1 -0
- package/dist/forge-v1/types.d.ts +87 -0
- package/dist/forge-v1/types.d.ts.map +1 -0
- package/dist/forge-v1/types.js +4 -0
- package/dist/forge-v1/types.js.map +1 -0
- package/dist/index.d.ts +12 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -83
- package/dist/index.js.map +1 -1
- package/dist/lifecycle.d.ts +8 -5
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +45 -112
- package/dist/lifecycle.js.map +1 -1
- package/dist/loader.d.ts +5 -8
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +10 -467
- package/dist/loader.js.map +1 -1
- package/dist/macro-engine.d.ts +9 -14
- package/dist/macro-engine.d.ts.map +1 -1
- package/dist/macro-engine.js +5 -238
- package/dist/macro-engine.js.map +1 -1
- package/dist/payload-capture.d.ts +10 -0
- package/dist/payload-capture.d.ts.map +1 -1
- package/dist/payload-capture.js +39 -9
- package/dist/payload-capture.js.map +1 -1
- package/dist/payload-command.d.ts +8 -6
- package/dist/payload-command.d.ts.map +1 -1
- package/dist/payload-command.js +36 -6
- package/dist/payload-command.js.map +1 -1
- package/dist/payload-state.d.ts +19 -0
- package/dist/payload-state.d.ts.map +1 -0
- package/dist/payload-state.js +19 -0
- package/dist/payload-state.js.map +1 -0
- package/dist/preset-command.d.ts +4 -4
- package/dist/preset-command.d.ts.map +1 -1
- package/dist/preset-command.js +33 -104
- package/dist/preset-command.js.map +1 -1
- package/dist/preview.d.ts +4 -4
- package/dist/preview.d.ts.map +1 -1
- package/dist/preview.js +34 -11
- package/dist/preview.js.map +1 -1
- package/dist/profile-command.d.ts +2 -2
- package/dist/profile-command.d.ts.map +1 -1
- package/dist/profile-command.js +15 -14
- package/dist/profile-command.js.map +1 -1
- package/dist/profile-service.d.ts.map +1 -1
- package/dist/profile-service.js +23 -39
- package/dist/profile-service.js.map +1 -1
- package/dist/prompt-analysis.d.ts +24 -0
- package/dist/prompt-analysis.d.ts.map +1 -0
- package/dist/prompt-analysis.js +84 -0
- package/dist/prompt-analysis.js.map +1 -0
- package/dist/prompt-runtime.d.ts +19 -0
- package/dist/prompt-runtime.d.ts.map +1 -0
- package/dist/prompt-runtime.js +30 -0
- package/dist/prompt-runtime.js.map +1 -0
- package/dist/regex.js +6 -12
- package/dist/regex.js.map +1 -1
- package/dist/render-helpers.d.ts +2 -10
- package/dist/render-helpers.d.ts.map +1 -1
- package/dist/render-helpers.js +3 -53
- package/dist/render-helpers.js.map +1 -1
- package/dist/repositories/agent-profile.d.ts +36 -0
- package/dist/repositories/agent-profile.d.ts.map +1 -0
- package/dist/repositories/agent-profile.js +153 -0
- package/dist/repositories/agent-profile.js.map +1 -0
- package/dist/repositories/index.d.ts +3 -0
- package/dist/repositories/index.d.ts.map +1 -0
- package/dist/repositories/index.js +3 -0
- package/dist/repositories/index.js.map +1 -0
- package/dist/repositories/prompt-stack.d.ts +57 -0
- package/dist/repositories/prompt-stack.d.ts.map +1 -0
- package/dist/repositories/prompt-stack.js +175 -0
- package/dist/repositories/prompt-stack.js.map +1 -0
- package/dist/runtime/profile-runtime.d.ts +2 -2
- package/dist/runtime/profile-runtime.d.ts.map +1 -1
- package/dist/runtime/profile-runtime.js +13 -10
- package/dist/runtime/profile-runtime.js.map +1 -1
- package/dist/runtime/prompt-stack-runtime.d.ts +4 -3
- package/dist/runtime/prompt-stack-runtime.d.ts.map +1 -1
- package/dist/runtime/prompt-stack-runtime.js +42 -57
- package/dist/runtime/prompt-stack-runtime.js.map +1 -1
- package/dist/runtime/tool-policy-runtime.d.ts +2 -2
- package/dist/runtime/tool-policy-runtime.d.ts.map +1 -1
- package/dist/runtime/tool-policy-runtime.js +16 -6
- package/dist/runtime/tool-policy-runtime.js.map +1 -1
- package/dist/runtime/web-editor-runtime.d.ts +2 -1
- package/dist/runtime/web-editor-runtime.d.ts.map +1 -1
- package/dist/runtime/web-editor-runtime.js +8 -3
- package/dist/runtime/web-editor-runtime.js.map +1 -1
- package/dist/session-adapter.d.ts +17 -0
- package/dist/session-adapter.d.ts.map +1 -0
- package/dist/session-adapter.js +57 -0
- package/dist/session-adapter.js.map +1 -0
- package/dist/slot-renderers.d.ts +16 -3
- package/dist/slot-renderers.d.ts.map +1 -1
- package/dist/slot-renderers.js +15 -63
- package/dist/slot-renderers.js.map +1 -1
- package/dist/stack-migration.d.ts +6 -0
- package/dist/stack-migration.d.ts.map +1 -1
- package/dist/stack-migration.js +49 -52
- package/dist/stack-migration.js.map +1 -1
- package/dist/subagent/fingerprints.d.ts +24 -0
- package/dist/subagent/fingerprints.d.ts.map +1 -0
- package/dist/subagent/fingerprints.js +81 -0
- package/dist/subagent/fingerprints.js.map +1 -0
- package/dist/subagent/host-port.d.ts +296 -0
- package/dist/subagent/host-port.d.ts.map +1 -0
- package/dist/subagent/host-port.js +560 -0
- package/dist/subagent/host-port.js.map +1 -0
- package/dist/subagent/index.d.ts +10 -10
- package/dist/subagent/index.d.ts.map +1 -1
- package/dist/subagent/index.js +9 -10
- package/dist/subagent/index.js.map +1 -1
- package/dist/subagent-host.d.ts +99 -18
- package/dist/subagent-host.d.ts.map +1 -1
- package/dist/subagent-host.js +143 -146
- package/dist/subagent-host.js.map +1 -1
- package/dist/template-render.d.ts +18 -0
- package/dist/template-render.d.ts.map +1 -0
- package/dist/template-render.js +232 -0
- package/dist/template-render.js.map +1 -0
- package/dist/types.d.ts +40 -27
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/ui-contribution/contrib-port.d.ts +170 -0
- package/dist/ui-contribution/contrib-port.d.ts.map +1 -0
- package/dist/ui-contribution/contrib-port.js +640 -0
- package/dist/ui-contribution/contrib-port.js.map +1 -0
- package/dist/ui-contribution/index.d.ts +3 -0
- package/dist/ui-contribution/index.d.ts.map +1 -0
- package/dist/ui-contribution/index.js +2 -0
- package/dist/ui-contribution/index.js.map +1 -0
- package/dist/web-editor/client-script.generated.d.ts.map +1 -1
- package/dist/web-editor/client-script.generated.js +1 -1
- package/dist/web-editor/client-script.generated.js.map +1 -1
- package/dist/web-editor/client-styles.generated.d.ts.map +1 -1
- package/dist/web-editor/client-styles.generated.js +1 -1
- package/dist/web-editor/client-styles.generated.js.map +1 -1
- package/dist/web-editor/contrib-service.d.ts +41 -0
- package/dist/web-editor/contrib-service.d.ts.map +1 -0
- package/dist/web-editor/contrib-service.js +174 -0
- package/dist/web-editor/contrib-service.js.map +1 -0
- package/dist/web-editor/line-diff.d.ts +28 -0
- package/dist/web-editor/line-diff.d.ts.map +1 -0
- package/dist/web-editor/line-diff.js +216 -0
- package/dist/web-editor/line-diff.js.map +1 -0
- package/dist/web-editor/schema-form.d.ts +63 -0
- package/dist/web-editor/schema-form.d.ts.map +1 -0
- package/dist/web-editor/schema-form.js +213 -0
- package/dist/web-editor/schema-form.js.map +1 -0
- package/dist/web-editor/server.d.ts.map +1 -1
- package/dist/web-editor/server.js +72 -74
- package/dist/web-editor/server.js.map +1 -1
- package/dist/web-editor/styles.d.ts.map +1 -1
- package/dist/web-editor/styles.js +201 -21
- package/dist/web-editor/styles.js.map +1 -1
- package/dist/web-editor/types.d.ts +12 -35
- package/dist/web-editor/types.d.ts.map +1 -1
- package/dist/web-host.d.ts +6 -2
- package/dist/web-host.d.ts.map +1 -1
- package/dist/web-host.js +33 -103
- package/dist/web-host.js.map +1 -1
- package/dist/workspace.d.ts +74 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +351 -0
- package/dist/workspace.js.map +1 -0
- package/docs/README.md +7 -4
- package/docs/concepts/agent-profiles.md +1 -1
- package/docs/concepts/prompt-stacks.md +5 -5
- package/docs/design/0.5.1-plan.md +237 -0
- package/docs/design/README.md +21 -3
- package/docs/design/architecture-0.5.md +222 -0
- package/docs/design/archive/0.5-full-proposal/0.5-consumer-audit.md +62 -0
- package/docs/design/archive/0.5-full-proposal/0.5-inventory.md +208 -0
- package/docs/design/archive/0.5-full-proposal/0.5-phase0-decision-drafts.md +237 -0
- package/docs/design/archive/0.5-full-proposal/README.md +12 -0
- package/docs/design/archive/0.5-full-proposal/architecture-0.5.md +423 -0
- package/docs/design/archive/0.5-full-proposal/host-discovery-spike.md +103 -0
- package/docs/design/archive/0.5-full-proposal/template-language-spike.md +156 -0
- package/docs/design/context-diff-plan.md +78 -0
- package/docs/design/decision-template.md +33 -0
- package/docs/design/roadmap-0.4-archive.md +1 -1
- package/docs/design/subagents/interface-design.md +1 -1
- package/docs/development/architecture-rules.md +148 -0
- package/docs/development/release.md +7 -1
- package/docs/development/roadmap.md +37 -5
- package/docs/development/scoped-global-profiles-stacks.md +1 -1
- package/docs/development/setup.md +6 -4
- package/docs/getting-started.md +5 -4
- package/docs/guides/custom-macros-and-slots.md +8 -7
- package/docs/guides/debugging.md +1 -1
- package/docs/guides/delegation.md +18 -22
- package/docs/guides/migrating-to-0.5.md +107 -0
- package/docs/guides/use-cases.md +7 -11
- package/docs/guides/web-editor.md +6 -10
- package/docs/reference/commands.md +4 -3
- package/docs/reference/configuration.md +17 -18
- package/docs/reference/features.md +34 -80
- package/docs/reference/macros-and-slots.md +70 -49
- package/docs/reference/public-api.md +76 -17
- package/docs/reference/stack-schema.md +15 -10
- package/docs/reference/subagent-host-port.md +49 -0
- package/docs/reference/ui-contribution-port.md +51 -0
- package/docs/zh-CN/README.md +3 -3
- package/docs/zh-CN/concepts/agent-profiles.md +1 -1
- package/docs/zh-CN/concepts/prompt-stacks.md +5 -5
- package/docs/zh-CN/getting-started.md +3 -2
- package/docs/zh-CN/guides/delegation.md +10 -12
- package/docs/zh-CN/guides/migrating-to-0.5.md +92 -0
- package/docs/zh-CN/guides/web-editor.md +4 -4
- package/docs/zh-CN/reference/commands.md +3 -2
- package/examples/custom-system-status-extension/README.md +3 -3
- package/examples/custom-system-status-extension/index.ts +2 -1
- package/examples/custom-system-status-extension/prompt-stack.json +4 -3
- package/examples/default-prompt-stack.json +9 -4
- package/examples/image-reader-prompt-stack.json +16 -26
- package/examples/reviewer-prompt-stack.json +13 -24
- package/package.json +106 -120
- package/dist/runtime/subagent-runtime.d.ts +0 -45
- package/dist/runtime/subagent-runtime.d.ts.map +0 -1
- package/dist/runtime/subagent-runtime.js +0 -343
- package/dist/runtime/subagent-runtime.js.map +0 -1
- package/dist/runtime-state.d.ts +0 -30
- package/dist/runtime-state.d.ts.map +0 -1
- package/dist/runtime-state.js +0 -17
- package/dist/runtime-state.js.map +0 -1
- package/dist/sillytavern-importer/items.d.ts +0 -3
- package/dist/sillytavern-importer/items.d.ts.map +0 -1
- package/dist/sillytavern-importer/items.js +0 -88
- package/dist/sillytavern-importer/items.js.map +0 -1
- package/dist/sillytavern-importer/macros.d.ts +0 -15
- package/dist/sillytavern-importer/macros.d.ts.map +0 -1
- package/dist/sillytavern-importer/macros.js +0 -141
- package/dist/sillytavern-importer/macros.js.map +0 -1
- package/dist/sillytavern-importer/prompt-order.d.ts +0 -6
- package/dist/sillytavern-importer/prompt-order.d.ts.map +0 -1
- package/dist/sillytavern-importer/prompt-order.js +0 -38
- package/dist/sillytavern-importer/prompt-order.js.map +0 -1
- package/dist/sillytavern-importer/regex.d.ts +0 -3
- package/dist/sillytavern-importer/regex.d.ts.map +0 -1
- package/dist/sillytavern-importer/regex.js +0 -275
- package/dist/sillytavern-importer/regex.js.map +0 -1
- package/dist/sillytavern-importer/report.d.ts +0 -21
- package/dist/sillytavern-importer/report.d.ts.map +0 -1
- package/dist/sillytavern-importer/report.js +0 -166
- package/dist/sillytavern-importer/report.js.map +0 -1
- package/dist/sillytavern-importer/types.d.ts +0 -106
- package/dist/sillytavern-importer/types.d.ts.map +0 -1
- package/dist/sillytavern-importer/types.js +0 -2
- package/dist/sillytavern-importer/types.js.map +0 -1
- package/dist/sillytavern-importer.d.ts +0 -5
- package/dist/sillytavern-importer.d.ts.map +0 -1
- package/dist/sillytavern-importer.js +0 -117
- package/dist/sillytavern-importer.js.map +0 -1
- package/dist/subagent/canonical.d.ts +0 -22
- package/dist/subagent/canonical.d.ts.map +0 -1
- package/dist/subagent/canonical.js +0 -24
- package/dist/subagent/canonical.js.map +0 -1
- package/dist/subagent/context.d.ts +0 -8
- package/dist/subagent/context.d.ts.map +0 -1
- package/dist/subagent/context.js +0 -125
- package/dist/subagent/context.js.map +0 -1
- package/dist/subagent/contract.d.ts +0 -10
- package/dist/subagent/contract.d.ts.map +0 -1
- package/dist/subagent/contract.js +0 -10
- package/dist/subagent/contract.js.map +0 -1
- package/dist/subagent/plan.d.ts +0 -18
- package/dist/subagent/plan.d.ts.map +0 -1
- package/dist/subagent/plan.js +0 -157
- package/dist/subagent/plan.js.map +0 -1
- package/dist/subagent/preflight.d.ts +0 -4
- package/dist/subagent/preflight.d.ts.map +0 -1
- package/dist/subagent/preflight.js +0 -108
- package/dist/subagent/preflight.js.map +0 -1
- package/dist/subagent/request.d.ts +0 -4
- package/dist/subagent/request.d.ts.map +0 -1
- package/dist/subagent/request.js +0 -154
- package/dist/subagent/request.js.map +0 -1
- package/dist/subagent/response.d.ts +0 -8
- package/dist/subagent/response.d.ts.map +0 -1
- package/dist/subagent/response.js +0 -155
- package/dist/subagent/response.js.map +0 -1
- package/dist/subagent/tools.d.ts +0 -4
- package/dist/subagent/tools.d.ts.map +0 -1
- package/dist/subagent/tools.js +0 -42
- package/dist/subagent/tools.js.map +0 -1
- package/dist/subagent/types.d.ts +0 -272
- package/dist/subagent/types.d.ts.map +0 -1
- package/dist/subagent/types.js +0 -3
- package/dist/subagent/types.js.map +0 -1
- package/dist/subagent/validation.d.ts +0 -35
- package/dist/subagent/validation.d.ts.map +0 -1
- package/dist/subagent/validation.js +0 -314
- package/dist/subagent/validation.js.map +0 -1
- package/dist/subagent-command.d.ts +0 -5
- package/dist/subagent-command.d.ts.map +0 -1
- package/dist/subagent-command.js +0 -249
- package/dist/subagent-command.js.map +0 -1
- package/dist/subagent-profile-tool.d.ts +0 -49
- package/dist/subagent-profile-tool.d.ts.map +0 -1
- package/dist/subagent-profile-tool.js +0 -125
- package/dist/subagent-profile-tool.js.map +0 -1
- package/dist/subagent-tool.d.ts +0 -77
- package/dist/subagent-tool.d.ts.map +0 -1
- package/dist/subagent-tool.js +0 -559
- package/dist/subagent-tool.js.map +0 -1
- package/docs/guides/sillytavern-import.md +0 -47
- package/docs/reference/subagent-adapter.md +0 -204
- package/examples/sillytavern-dm-writer-prompt-stack.json +0 -190
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-neutral context diff engine.
|
|
3
|
+
*
|
|
4
|
+
* Pure functions only: no DOM, no Vue, no Node APIs. Consecutive turn
|
|
5
|
+
* snapshots are compared with a simple prefix-walk that models KV-cache
|
|
6
|
+
* reuse without attempting a full Myers diff.
|
|
7
|
+
*/
|
|
8
|
+
/** Estimate tokens from characters using the same chars/4 approximation as payload capture. */
|
|
9
|
+
export function estimateApproxTokens(text) {
|
|
10
|
+
return Math.max(1, Math.ceil(text.length / 4));
|
|
11
|
+
}
|
|
12
|
+
/** Pure string hash used as the block identity shortcut. */
|
|
13
|
+
export function hashText(text) {
|
|
14
|
+
let hash = 0x811c9dc5;
|
|
15
|
+
for (let i = 0; i < text.length; i++) {
|
|
16
|
+
hash ^= text.charCodeAt(i);
|
|
17
|
+
hash = Math.imul(hash, 0x01000193);
|
|
18
|
+
}
|
|
19
|
+
return (hash >>> 0).toString(16).padStart(8, "0");
|
|
20
|
+
}
|
|
21
|
+
export function createBlock(key, role, text, serialized) {
|
|
22
|
+
const hashInput = serialized === undefined
|
|
23
|
+
? { role, text }
|
|
24
|
+
: { role, text, serialized };
|
|
25
|
+
const serializedHashInput = stringifyHashInput(hashInput);
|
|
26
|
+
return {
|
|
27
|
+
key,
|
|
28
|
+
role,
|
|
29
|
+
text,
|
|
30
|
+
chars: text.length,
|
|
31
|
+
approxTokens: estimateApproxTokens(text),
|
|
32
|
+
hash: hashText(serializedHashInput),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export function createTurnSnapshot(input) {
|
|
36
|
+
return {
|
|
37
|
+
turnId: input.turnId,
|
|
38
|
+
capturedAt: input.capturedAt ?? "",
|
|
39
|
+
stackId: input.stackId ?? "",
|
|
40
|
+
blocks: input.blocks ?? [],
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export function turnApproxTokens(turn) {
|
|
44
|
+
const chars = turn.blocks.reduce((sum, block) => sum + block.chars, 0);
|
|
45
|
+
return chars === 0 ? 0 : Math.ceil(chars / 4);
|
|
46
|
+
}
|
|
47
|
+
function commonPrefixLength(a, b) {
|
|
48
|
+
const max = Math.min(a.length, b.length);
|
|
49
|
+
let index = 0;
|
|
50
|
+
while (index < max && a.charCodeAt(index) === b.charCodeAt(index)) {
|
|
51
|
+
index++;
|
|
52
|
+
}
|
|
53
|
+
return index;
|
|
54
|
+
}
|
|
55
|
+
function stringifyHashInput(value) {
|
|
56
|
+
try {
|
|
57
|
+
const serialized = JSON.stringify(value);
|
|
58
|
+
return serialized === undefined ? String(value) : serialized;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return String(value);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* A block hash includes fields that affect the provider wire request, while
|
|
66
|
+
* the visible block text remains the useful prompt excerpt. When a hash
|
|
67
|
+
* differs because metadata changed without changing the excerpt, no part of
|
|
68
|
+
* that excerpt is safe to count as a reusable prefix.
|
|
69
|
+
*/
|
|
70
|
+
function safeCommonPrefixLength(before, after) {
|
|
71
|
+
if (before.role !== after.role || before.text === after.text)
|
|
72
|
+
return 0;
|
|
73
|
+
return commonPrefixLength(before.text, after.text);
|
|
74
|
+
}
|
|
75
|
+
function classify(before, after) {
|
|
76
|
+
if (before && after) {
|
|
77
|
+
if (before.hash === after.hash) {
|
|
78
|
+
return { status: "same", before, after, tokenDelta: 0 };
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
status: "modified",
|
|
82
|
+
before,
|
|
83
|
+
after,
|
|
84
|
+
tokenDelta: 0,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
if (before) {
|
|
88
|
+
return { status: "removed", before, tokenDelta: 0 };
|
|
89
|
+
}
|
|
90
|
+
return { status: "added", after, tokenDelta: 0 };
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Allocate the request-level chars/4 delta across changed blocks. Per-block
|
|
94
|
+
* token deltas are deliberately based on character deltas, with the single
|
|
95
|
+
* request-level rounding remainder distributed across blocks so the chips and
|
|
96
|
+
* summary describe the same integer total.
|
|
97
|
+
*/
|
|
98
|
+
function assignTokenDeltas(blocks, deltaTokens) {
|
|
99
|
+
const candidates = blocks
|
|
100
|
+
.map((block) => ({
|
|
101
|
+
block,
|
|
102
|
+
charDelta: (block.after?.chars ?? 0) - (block.before?.chars ?? 0),
|
|
103
|
+
}))
|
|
104
|
+
.filter(({ block, charDelta }) => block.status !== "same" && charDelta !== 0);
|
|
105
|
+
if (candidates.length === 0)
|
|
106
|
+
return;
|
|
107
|
+
let allocated = 0;
|
|
108
|
+
for (const candidate of candidates) {
|
|
109
|
+
candidate.block.tokenDelta = Math.trunc(candidate.charDelta / 4);
|
|
110
|
+
allocated += candidate.block.tokenDelta;
|
|
111
|
+
}
|
|
112
|
+
let remainder = deltaTokens - allocated;
|
|
113
|
+
if (remainder === 0)
|
|
114
|
+
return;
|
|
115
|
+
const direction = remainder > 0 ? 1 : -1;
|
|
116
|
+
const preferred = candidates.filter(({ charDelta }) => direction > 0 ? charDelta > 0 : charDelta < 0);
|
|
117
|
+
const targets = preferred.length > 0 ? preferred : candidates;
|
|
118
|
+
const wholeShare = Math.trunc(Math.abs(remainder) / targets.length);
|
|
119
|
+
if (wholeShare > 0) {
|
|
120
|
+
for (const target of targets)
|
|
121
|
+
target.block.tokenDelta += direction * wholeShare;
|
|
122
|
+
remainder -= direction * wholeShare * targets.length;
|
|
123
|
+
}
|
|
124
|
+
for (let index = 0; remainder !== 0; index++) {
|
|
125
|
+
targets[index % targets.length].block.tokenDelta += direction;
|
|
126
|
+
remainder -= direction;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function summarize(blocks, netTokens) {
|
|
130
|
+
let sameBlocks = 0;
|
|
131
|
+
let addedBlocks = 0;
|
|
132
|
+
let removedBlocks = 0;
|
|
133
|
+
let modifiedBlocks = 0;
|
|
134
|
+
let addedTokens = 0;
|
|
135
|
+
let removedTokens = 0;
|
|
136
|
+
for (const block of blocks) {
|
|
137
|
+
switch (block.status) {
|
|
138
|
+
case "same":
|
|
139
|
+
sameBlocks++;
|
|
140
|
+
break;
|
|
141
|
+
case "added":
|
|
142
|
+
addedBlocks++;
|
|
143
|
+
if (block.tokenDelta > 0)
|
|
144
|
+
addedTokens += block.tokenDelta;
|
|
145
|
+
if (block.tokenDelta < 0)
|
|
146
|
+
removedTokens += -block.tokenDelta;
|
|
147
|
+
break;
|
|
148
|
+
case "removed":
|
|
149
|
+
removedBlocks++;
|
|
150
|
+
if (block.tokenDelta > 0)
|
|
151
|
+
addedTokens += block.tokenDelta;
|
|
152
|
+
if (block.tokenDelta < 0)
|
|
153
|
+
removedTokens += -block.tokenDelta;
|
|
154
|
+
break;
|
|
155
|
+
case "modified":
|
|
156
|
+
modifiedBlocks++;
|
|
157
|
+
if (block.tokenDelta > 0) {
|
|
158
|
+
addedTokens += block.tokenDelta;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
removedTokens += -block.tokenDelta;
|
|
162
|
+
}
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
sameBlocks,
|
|
168
|
+
addedBlocks,
|
|
169
|
+
removedBlocks,
|
|
170
|
+
modifiedBlocks,
|
|
171
|
+
changedBlocks: addedBlocks + removedBlocks + modifiedBlocks,
|
|
172
|
+
addedTokens,
|
|
173
|
+
removedTokens,
|
|
174
|
+
netTokens,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
function hasUniqueStableKeys(blocks) {
|
|
178
|
+
const keys = blocks.map((block) => block.key);
|
|
179
|
+
return keys.every((key) => key.length > 0) && new Set(keys).size === keys.length;
|
|
180
|
+
}
|
|
181
|
+
function alignBlocks(beforeBlocks, afterBlocks) {
|
|
182
|
+
const afterKeys = new Set(afterBlocks.map((block) => block.key));
|
|
183
|
+
const useKeys = hasUniqueStableKeys(beforeBlocks)
|
|
184
|
+
&& hasUniqueStableKeys(afterBlocks)
|
|
185
|
+
&& beforeBlocks.some((block) => afterKeys.has(block.key));
|
|
186
|
+
if (!useKeys) {
|
|
187
|
+
return alignPositional(beforeBlocks, afterBlocks);
|
|
188
|
+
}
|
|
189
|
+
const beforeByKey = new Map(beforeBlocks.map((block) => [block.key, block]));
|
|
190
|
+
const beforeIndexByKey = new Map(beforeBlocks.map((block, index) => [block.key, index]));
|
|
191
|
+
const aligned = [];
|
|
192
|
+
let beforeCursor = 0;
|
|
193
|
+
let afterCursor = 0;
|
|
194
|
+
for (let afterIndex = 0; afterIndex < afterBlocks.length; afterIndex++) {
|
|
195
|
+
const after = afterBlocks[afterIndex];
|
|
196
|
+
const beforeIndex = beforeIndexByKey.get(after.key);
|
|
197
|
+
if (beforeIndex === undefined || beforeIndex < beforeCursor)
|
|
198
|
+
continue;
|
|
199
|
+
aligned.push(...alignPositional(beforeBlocks.slice(beforeCursor, beforeIndex), afterBlocks.slice(afterCursor, afterIndex)));
|
|
200
|
+
aligned.push({ before: beforeByKey.get(after.key), after });
|
|
201
|
+
beforeCursor = beforeIndex + 1;
|
|
202
|
+
afterCursor = afterIndex + 1;
|
|
203
|
+
}
|
|
204
|
+
aligned.push(...alignPositional(beforeBlocks.slice(beforeCursor), afterBlocks.slice(afterCursor)));
|
|
205
|
+
return aligned;
|
|
206
|
+
}
|
|
207
|
+
function alignPositional(beforeBlocks, afterBlocks) {
|
|
208
|
+
const maxLength = Math.max(beforeBlocks.length, afterBlocks.length);
|
|
209
|
+
return Array.from({ length: maxLength }, (_, index) => ({
|
|
210
|
+
before: beforeBlocks[index],
|
|
211
|
+
after: afterBlocks[index],
|
|
212
|
+
}));
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Diff two consecutive turn snapshots.
|
|
216
|
+
*
|
|
217
|
+
* The cache-boundary walk compares block arrays positionally while hashes
|
|
218
|
+
* match. This preserves the serialized-prefix meaning even when a later
|
|
219
|
+
* block is moved. Classification uses stable block keys after the boundary so
|
|
220
|
+
* a middle insertion does not make every following block look modified.
|
|
221
|
+
*/
|
|
222
|
+
export function diffTurns(previous, current) {
|
|
223
|
+
const beforeBlocks = previous?.blocks ?? [];
|
|
224
|
+
const afterBlocks = current.blocks;
|
|
225
|
+
const diffBlocks = alignBlocks(beforeBlocks, afterBlocks).map(({ before, after }) => classify(before, after));
|
|
226
|
+
let prefixChars = 0;
|
|
227
|
+
let boundaryCrossed = false;
|
|
228
|
+
for (let index = 0; index < Math.max(beforeBlocks.length, afterBlocks.length); index++) {
|
|
229
|
+
const before = beforeBlocks[index];
|
|
230
|
+
const after = afterBlocks[index];
|
|
231
|
+
if (!boundaryCrossed) {
|
|
232
|
+
if (before && after && before.hash === after.hash) {
|
|
233
|
+
prefixChars += after.chars;
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
if (before && after) {
|
|
237
|
+
prefixChars += safeCommonPrefixLength(before, after);
|
|
238
|
+
}
|
|
239
|
+
boundaryCrossed = true;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
const currentTokens = turnApproxTokens(current);
|
|
243
|
+
const previousTokens = previous ? turnApproxTokens(previous) : 0;
|
|
244
|
+
const currentChars = afterBlocks.reduce((sum, block) => sum + block.chars, 0);
|
|
245
|
+
const prefixTokens = !boundaryCrossed || prefixChars >= currentChars
|
|
246
|
+
? currentTokens
|
|
247
|
+
: Math.min(currentTokens, Math.floor(prefixChars / 4));
|
|
248
|
+
const deltaTokens = currentTokens - previousTokens;
|
|
249
|
+
assignTokenDeltas(diffBlocks, deltaTokens);
|
|
250
|
+
const prefixRatio = currentTokens === 0 ? 0 : prefixTokens / currentTokens;
|
|
251
|
+
return {
|
|
252
|
+
blocks: diffBlocks,
|
|
253
|
+
prefixTokens,
|
|
254
|
+
prefixRatio,
|
|
255
|
+
deltaTokens,
|
|
256
|
+
summary: summarize(diffBlocks, deltaTokens),
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=context-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-diff.js","sourceRoot":"","sources":["../src/context-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-registry.d.ts","sourceRoot":"","sources":["../src/extension-registry.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,aAAa,CAAC;AAEjG,MAAM,WAAW,+BAA+B;IAC/C,IAAI,EAAE,yBAAyB,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,MAAM,EAAE,CAAC;IACxD,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,4BAA4B,GAAG,MAAM,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC;AAE3F,MAAM,WAAW,iCAAiC;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"extension-registry.d.ts","sourceRoot":"","sources":["../src/extension-registry.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,aAAa,CAAC;AAEjG,MAAM,WAAW,+BAA+B;IAC/C,IAAI,EAAE,yBAAyB,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,MAAM,EAAE,CAAC;IACxD,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,4BAA4B,GAAG,MAAM,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC;AAE3F,MAAM,WAAW,iCAAiC;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAOnE"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
export function assertRegistryName(kind, name) {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
// Names must be a single template-path segment: forge-v1 uses "." as the
|
|
3
|
+
// path separator, so a dotted name ("git.branch") could be registered but
|
|
4
|
+
// never addressed — "extensions.git.branch" parses as three segments.
|
|
5
|
+
if (!/^[A-Za-z][A-Za-z0-9_-]*$/.test(name)) {
|
|
6
|
+
throw new Error(`${kind} name must start with a letter and contain only letters, numbers, underscore, or hyphen: ${name}`);
|
|
4
7
|
}
|
|
5
8
|
}
|
|
6
9
|
//# sourceMappingURL=extension-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-registry.js","sourceRoot":"","sources":["../src/extension-registry.ts"],"names":[],"mappings":"AA4BA,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,IAAY;IAC5D,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"extension-registry.js","sourceRoot":"","sources":["../src/extension-registry.ts"],"names":[],"mappings":"AA4BA,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,IAAY;IAC5D,yEAAyE;IACzE,0EAA0E;IAC1E,sEAAsE;IACtE,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,4FAA4F,IAAI,EAAE,CAAC,CAAC;IAC5H,CAAC;AACF,CAAC"}
|
package/dist/forge-config.d.ts
CHANGED
|
@@ -1,114 +1,9 @@
|
|
|
1
|
-
import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
import { type ResourceScope } from "./resource-identity.ts";
|
|
3
|
-
/** Backend used when neither a per-run override nor a configured default applies. */
|
|
4
|
-
export declare const DEFAULT_SUBAGENT_BACKEND_ID = "pi-subprocess-readonly";
|
|
5
|
-
/** Preserve the original foreground-run timeout unless the user configures one. */
|
|
6
|
-
export declare const DEFAULT_SUBAGENT_TIMEOUT_MS = 60000;
|
|
7
|
-
export declare const MIN_SUBAGENT_TIMEOUT_MS = 1000;
|
|
8
|
-
export declare const MAX_SUBAGENT_TIMEOUT_MS = 3600000;
|
|
9
1
|
/**
|
|
10
2
|
* Development/test override for the global config location. Keeps automated
|
|
11
3
|
* tests hermetic regardless of the developer's real ~/.pi/forge/config.json.
|
|
12
4
|
* Not part of the supported user-facing configuration surface.
|
|
13
5
|
*/
|
|
14
6
|
export declare const GLOBAL_FORGE_CONFIG_PATH_ENV = "PI_FORGE_GLOBAL_CONFIG_PATH";
|
|
15
|
-
export type ForgeSubagentBackendSource = "explicit" | "project-profile" | "global-profile" | "project" | "global" | "built-in";
|
|
16
|
-
export type ForgeSubagentConfigSource = "project" | "global";
|
|
17
|
-
export type ForgeSubagentProfileSource = "project-profile" | "global-profile";
|
|
18
|
-
export interface ForgeSubagentProfileSettings {
|
|
19
|
-
enabled?: boolean;
|
|
20
|
-
enabledSource?: ForgeSubagentProfileSource;
|
|
21
|
-
backend?: string;
|
|
22
|
-
backendSource?: ForgeSubagentProfileSource;
|
|
23
|
-
timeoutMs?: number;
|
|
24
|
-
timeoutSource?: ForgeSubagentProfileSource;
|
|
25
|
-
}
|
|
26
|
-
export interface ForgeSubagentSettings {
|
|
27
|
-
allowAgentInvocationWithoutApproval: boolean;
|
|
28
|
-
/** Configured default backend ID; a trusted project config wins over the global config. */
|
|
29
|
-
backend?: string;
|
|
30
|
-
backendSource?: ForgeSubagentConfigSource;
|
|
31
|
-
/** Best-effort foreground timeout; a trusted project config wins over the global config. */
|
|
32
|
-
timeoutMs: number;
|
|
33
|
-
timeoutSource: ForgeSubagentConfigSource | "built-in";
|
|
34
|
-
/**
|
|
35
|
-
* Embed a compact summary of enabled subagent profiles directly in the
|
|
36
|
-
* forge_subagent tool description so the parent model does not need a
|
|
37
|
-
* discovery call for a small set of frequently used profiles. Opt-in
|
|
38
|
-
* because the summary rides in every request; the discovery tool remains
|
|
39
|
-
* the authoritative surface.
|
|
40
|
-
*/
|
|
41
|
-
summaryInToolDescription: boolean;
|
|
42
|
-
summaryInToolDescriptionSource?: ForgeSubagentConfigSource;
|
|
43
|
-
/**
|
|
44
|
-
* Per-profile delegation allowlist and execution overrides, keyed by
|
|
45
|
-
* canonical scoped selector (`global:<id>` or `project:<id>`). Unlisted
|
|
46
|
-
* profiles are not delegatable.
|
|
47
|
-
*/
|
|
48
|
-
profiles: Record<string, ForgeSubagentProfileSettings>;
|
|
49
|
-
configPath: string;
|
|
50
|
-
globalConfigPath: string;
|
|
51
|
-
warnings: string[];
|
|
52
|
-
}
|
|
53
|
-
export interface ResolvedSubagentBackend {
|
|
54
|
-
id: string;
|
|
55
|
-
source: ForgeSubagentBackendSource;
|
|
56
|
-
}
|
|
57
|
-
export interface ResolvedSubagentTimeout {
|
|
58
|
-
milliseconds: number;
|
|
59
|
-
source: Exclude<ForgeSubagentBackendSource, "explicit">;
|
|
60
|
-
}
|
|
61
|
-
export interface ResolvedSubagentProfilePolicy {
|
|
62
|
-
/** The selector used to resolve this policy, e.g. `reviewer` or `global:reviewer`. */
|
|
63
|
-
profileId: string;
|
|
64
|
-
enabled: boolean;
|
|
65
|
-
enabledSource: ForgeSubagentProfileSource | "built-in";
|
|
66
|
-
backend: ResolvedSubagentBackend;
|
|
67
|
-
timeout: ResolvedSubagentTimeout;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Resolve the effective backend for one run: explicit per-run override, then
|
|
71
|
-
* a matching-scope per-profile override, then trusted-project/global defaults,
|
|
72
|
-
* then the built-in subprocess backend. There is deliberately no fallback when
|
|
73
|
-
* the resolved backend is missing or rejects the intent.
|
|
74
|
-
*/
|
|
75
|
-
export declare function resolveSubagentBackend(settings: ForgeSubagentSettings, explicitBackend?: string, profileId?: string): ResolvedSubagentBackend;
|
|
76
|
-
export declare function resolveSubagentTimeout(settings: ForgeSubagentSettings, profileId?: string): ResolvedSubagentTimeout;
|
|
77
|
-
export declare function resolveSubagentProfilePolicy(settings: ForgeSubagentSettings, profileId: string, explicitBackend?: string): ResolvedSubagentProfilePolicy;
|
|
78
|
-
export declare function loadForgeSubagentSettings(ctx: ExtensionContext): ForgeSubagentSettings;
|
|
79
|
-
export declare function isValidSubagentTimeoutMs(value: unknown): value is number;
|
|
80
|
-
/**
|
|
81
|
-
* One scoped per-profile delegation update. `enabled: false`,
|
|
82
|
-
* `backend: null`, and `timeoutMs: null` remove the explicit value; entries
|
|
83
|
-
* that become empty are removed so the file only records real overrides.
|
|
84
|
-
*/
|
|
85
|
-
export interface ForgeSubagentProfileConfigUpdate {
|
|
86
|
-
enabled?: boolean;
|
|
87
|
-
backend?: string | null;
|
|
88
|
-
timeoutMs?: number | null;
|
|
89
|
-
}
|
|
90
|
-
export type ForgeSubagentProfileConfigResult = {
|
|
91
|
-
ok: true;
|
|
92
|
-
configPath: string;
|
|
93
|
-
} | {
|
|
94
|
-
ok: false;
|
|
95
|
-
error: string;
|
|
96
|
-
};
|
|
97
7
|
export declare function globalForgeConfigPath(): string;
|
|
98
8
|
export declare function projectForgeConfigPath(cwd: string): string;
|
|
99
|
-
/**
|
|
100
|
-
* Update `subagents.profiles.<id>` in the selected scope's config file,
|
|
101
|
-
* preserving unknown top-level, `subagents`, and per-entry fields. Project
|
|
102
|
-
* config updates must be gated on project trust by the caller; global config
|
|
103
|
-
* is user-owned and always writable.
|
|
104
|
-
*/
|
|
105
|
-
export declare function updateForgeSubagentProfileConfig(cwd: string, profileId: string, update: ForgeSubagentProfileConfigUpdate, options?: {
|
|
106
|
-
scope?: ResourceScope;
|
|
107
|
-
}): ForgeSubagentProfileConfigResult;
|
|
108
|
-
/**
|
|
109
|
-
* Resolve the configured per-profile settings for a profile selector. Bare
|
|
110
|
-
* selectors use project-first effective lookup; qualified selectors address
|
|
111
|
-
* the exact scope. Returns undefined for unknown or malformed selectors.
|
|
112
|
-
*/
|
|
113
|
-
export declare function configuredProfileForSelector(settings: ForgeSubagentSettings, profileId: string): ForgeSubagentProfileSettings | undefined;
|
|
114
9
|
//# sourceMappingURL=forge-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forge-config.d.ts","sourceRoot":"","sources":["../src/forge-config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"forge-config.d.ts","sourceRoot":"","sources":["../src/forge-config.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,gCAAgC,CAAC;AAE1E,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1D"}
|