@zihanw/pi-forge 0.4.1 → 0.5.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/CHANGELOG.md +41 -1
- package/README.md +11 -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/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 +49 -81
- package/dist/index.js.map +1 -1
- package/dist/lifecycle.d.ts +6 -5
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +43 -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-command.d.ts +6 -6
- package/dist/payload-command.d.ts.map +1 -1
- package/dist/payload-command.js.map +1 -1
- package/dist/payload-state.d.ts +16 -0
- package/dist/payload-state.d.ts.map +1 -0
- package/dist/payload-state.js +14 -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 +17 -8
- 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 +3 -3
- package/dist/runtime/tool-policy-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/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/server.d.ts.map +1 -1
- package/dist/web-editor/server.js +1 -68
- 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 +13 -0
- package/dist/web-editor/styles.js.map +1 -1
- package/dist/web-editor/types.d.ts +0 -35
- package/dist/web-editor/types.d.ts.map +1 -1
- package/dist/web-host.d.ts +4 -2
- package/dist/web-host.d.ts.map +1 -1
- package/dist/web-host.js +32 -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 +6 -4
- package/docs/concepts/agent-profiles.md +1 -1
- package/docs/concepts/prompt-stacks.md +5 -5
- package/docs/design/README.md +21 -3
- package/docs/design/architecture-0.5.md +211 -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 +72 -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/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 +5 -9
- 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 +64 -17
- package/docs/reference/stack-schema.md +14 -9
- package/docs/reference/subagent-host-port.md +49 -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 +4 -4
- 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 +101 -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,560 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
/**
|
|
3
|
+
* Cross-extension Forge host port v1 over the Pi event bus.
|
|
4
|
+
*
|
|
5
|
+
* This is the in-process RPC contract used by the optional subagent package to
|
|
6
|
+
* discover the active main pi-forge host and invoke its three minimal
|
|
7
|
+
* operations (discovery, profile listing, and prompt preparation). Messages
|
|
8
|
+
* are plain, recursively validated, JSON-compatible data only — no functions,
|
|
9
|
+
* live contexts, or internal registries cross the bus. The port itself is not
|
|
10
|
+
* a trust boundary.
|
|
11
|
+
*
|
|
12
|
+
* Ownership: the main pi-forge host owns profiles, stacks, and prompt
|
|
13
|
+
* compilation. The optional package sends resource selectors + task + backend
|
|
14
|
+
* facts and receives immutable preparation artifacts back.
|
|
15
|
+
*/
|
|
16
|
+
export const FORGE_HOST_PORT_VERSION = 1;
|
|
17
|
+
export const FORGE_HOST_PORT_NAMESPACE = "@zihanw/pi-forge/host/v1";
|
|
18
|
+
export const FORGE_HOST_PORT_OPERATIONS = ["listProfiles", "resolveProfile", "prepare"];
|
|
19
|
+
export const FORGE_HOST_CHANNEL = {
|
|
20
|
+
discover: `${FORGE_HOST_PORT_NAMESPACE}/discover`,
|
|
21
|
+
available: `${FORGE_HOST_PORT_NAMESPACE}/available`,
|
|
22
|
+
request: `${FORGE_HOST_PORT_NAMESPACE}/request`,
|
|
23
|
+
reply: `${FORGE_HOST_PORT_NAMESPACE}/reply`,
|
|
24
|
+
unavailable: `${FORGE_HOST_PORT_NAMESPACE}/unavailable`,
|
|
25
|
+
};
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Errors and validation.
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
export class ForgeHostPortError extends Error {
|
|
30
|
+
code;
|
|
31
|
+
constructor(code, message) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.code = code;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function validateListProfilesRequest(value) {
|
|
37
|
+
if (value === undefined || value === null)
|
|
38
|
+
return { ok: true, data: {} };
|
|
39
|
+
if (!isRecord(value))
|
|
40
|
+
return { ok: false, error: "listProfiles request must be an empty object." };
|
|
41
|
+
// The request intentionally carries no fields; reject any unknown fields so a
|
|
42
|
+
// future/old consumer cannot silently send material that the host must own.
|
|
43
|
+
if (Object.keys(value).length > 0) {
|
|
44
|
+
return { ok: false, error: `listProfiles request must be empty; unexpected fields: ${Object.keys(value).join(", ")}` };
|
|
45
|
+
}
|
|
46
|
+
return { ok: true, data: {} };
|
|
47
|
+
}
|
|
48
|
+
export function validateListProfilesResponse(value) {
|
|
49
|
+
if (!isRecord(value) || !Array.isArray(value.profiles)) {
|
|
50
|
+
return { ok: false, error: "listProfiles response must contain a profiles array." };
|
|
51
|
+
}
|
|
52
|
+
for (const profile of value.profiles) {
|
|
53
|
+
if (!isRecord(profile) || typeof profile.profileId !== "string" || !isRecord(profile.model)
|
|
54
|
+
|| typeof profile.model.provider !== "string" || typeof profile.model.id !== "string"
|
|
55
|
+
|| typeof profile.thinkingLevel !== "string" || typeof profile.usable !== "boolean") {
|
|
56
|
+
return { ok: false, error: "listProfiles response contains a malformed profile summary." };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (!isJsonCompatible(value))
|
|
60
|
+
return { ok: false, error: "listProfiles response is not JSON-compatible." };
|
|
61
|
+
return { ok: true, data: value };
|
|
62
|
+
}
|
|
63
|
+
const FORGE_PREPARE_REQUEST_FIELDS = new Set([
|
|
64
|
+
"profile", "task", "access", "backend",
|
|
65
|
+
]);
|
|
66
|
+
const FORGE_ACCESS_LEVELS = new Set(["none", "read-only", "workspace-write"]);
|
|
67
|
+
const FORGE_NETWORK_POLICIES = new Set(["deny", "allow"]);
|
|
68
|
+
const FORGE_TASK_FIELDS = new Set(["text"]);
|
|
69
|
+
const FORGE_ACCESS_FIELDS = new Set(["level", "network", "allowProcess"]);
|
|
70
|
+
const FORGE_BACKEND_FIELDS = new Set(["model", "thinkingLevel", "toolCatalog"]);
|
|
71
|
+
const FORGE_MODEL_FIELDS = new Set(["provider", "id"]);
|
|
72
|
+
const FORGE_TOOL_FIELDS = new Set(["id", "name", "effects"]);
|
|
73
|
+
function assertExactKeys(record, fields, path) {
|
|
74
|
+
const unknown = Object.keys(record).filter((key) => !fields.has(key));
|
|
75
|
+
if (unknown.length > 0) {
|
|
76
|
+
return { ok: false, error: `${path} contains unsupported fields: ${unknown.join(", ")}.` };
|
|
77
|
+
}
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
export function validateResolveProfileRequest(value) {
|
|
81
|
+
if (!isRecord(value))
|
|
82
|
+
return { ok: false, error: "resolveProfile request must be an object." };
|
|
83
|
+
if (Object.keys(value).length !== 1 || typeof value.profile !== "string" || !value.profile.trim()) {
|
|
84
|
+
return { ok: false, error: "resolveProfile request requires a non-empty profile selector." };
|
|
85
|
+
}
|
|
86
|
+
if (!isJsonCompatible(value))
|
|
87
|
+
return { ok: false, error: "resolveProfile request is not JSON-compatible." };
|
|
88
|
+
return { ok: true, data: value };
|
|
89
|
+
}
|
|
90
|
+
export function validateResolveProfileResponse(value) {
|
|
91
|
+
if (!isRecord(value) || !("snapshot" in value) || !isRecord(value.snapshot)) {
|
|
92
|
+
return { ok: false, error: "resolveProfile response must contain a snapshot object." };
|
|
93
|
+
}
|
|
94
|
+
if (!isJsonCompatible(value))
|
|
95
|
+
return { ok: false, error: "resolveProfile response is not JSON-compatible." };
|
|
96
|
+
// The optional package validates the snapshot profile deeply; the host port
|
|
97
|
+
// only guarantees the wire envelope.
|
|
98
|
+
return { ok: true, data: value };
|
|
99
|
+
}
|
|
100
|
+
export function validatePrepareRequest(value) {
|
|
101
|
+
if (!isRecord(value))
|
|
102
|
+
return { ok: false, error: "prepare request must be an object." };
|
|
103
|
+
const top = assertExactKeys(value, FORGE_PREPARE_REQUEST_FIELDS, "prepare request");
|
|
104
|
+
if (top)
|
|
105
|
+
return top;
|
|
106
|
+
if (typeof value.profile !== "string" || !value.profile.trim()) {
|
|
107
|
+
return { ok: false, error: "prepare request requires a non-empty profile selector." };
|
|
108
|
+
}
|
|
109
|
+
if (!isRecord(value.task))
|
|
110
|
+
return { ok: false, error: "prepare request requires task to be an object." };
|
|
111
|
+
const task = assertExactKeys(value.task, FORGE_TASK_FIELDS, "prepare request task");
|
|
112
|
+
if (task)
|
|
113
|
+
return task;
|
|
114
|
+
if (typeof value.task.text !== "string") {
|
|
115
|
+
return { ok: false, error: "prepare request requires task.text to be a string." };
|
|
116
|
+
}
|
|
117
|
+
if (!isRecord(value.access))
|
|
118
|
+
return { ok: false, error: "prepare request requires access to be an object." };
|
|
119
|
+
const access = assertExactKeys(value.access, FORGE_ACCESS_FIELDS, "prepare request access");
|
|
120
|
+
if (access)
|
|
121
|
+
return access;
|
|
122
|
+
if (typeof value.access.level !== "string" || !FORGE_ACCESS_LEVELS.has(value.access.level)) {
|
|
123
|
+
return { ok: false, error: "prepare request access.level must be one of none/read-only/workspace-write." };
|
|
124
|
+
}
|
|
125
|
+
if (typeof value.access.network !== "string" || !FORGE_NETWORK_POLICIES.has(value.access.network)) {
|
|
126
|
+
return { ok: false, error: "prepare request access.network must be deny or allow." };
|
|
127
|
+
}
|
|
128
|
+
if (typeof value.access.allowProcess !== "boolean") {
|
|
129
|
+
return { ok: false, error: "prepare request access.allowProcess must be a boolean." };
|
|
130
|
+
}
|
|
131
|
+
if (!isRecord(value.backend))
|
|
132
|
+
return { ok: false, error: "prepare request requires backend to be an object." };
|
|
133
|
+
const backend = assertExactKeys(value.backend, FORGE_BACKEND_FIELDS, "prepare request backend");
|
|
134
|
+
if (backend)
|
|
135
|
+
return backend;
|
|
136
|
+
if (!isRecord(value.backend.model))
|
|
137
|
+
return { ok: false, error: "prepare request backend.model must be an object." };
|
|
138
|
+
const model = assertExactKeys(value.backend.model, FORGE_MODEL_FIELDS, "prepare request backend.model");
|
|
139
|
+
if (model)
|
|
140
|
+
return model;
|
|
141
|
+
if (typeof value.backend.model.provider !== "string" || !value.backend.model.provider.trim()) {
|
|
142
|
+
return { ok: false, error: "prepare request backend.model.provider must be a non-empty string." };
|
|
143
|
+
}
|
|
144
|
+
if (typeof value.backend.model.id !== "string" || !value.backend.model.id.trim()) {
|
|
145
|
+
return { ok: false, error: "prepare request backend.model.id must be a non-empty string." };
|
|
146
|
+
}
|
|
147
|
+
if (typeof value.backend.thinkingLevel !== "string" || !value.backend.thinkingLevel.trim()) {
|
|
148
|
+
return { ok: false, error: "prepare request backend.thinkingLevel must be a non-empty string." };
|
|
149
|
+
}
|
|
150
|
+
if (!Array.isArray(value.backend.toolCatalog)) {
|
|
151
|
+
return { ok: false, error: "prepare request backend.toolCatalog must be an array." };
|
|
152
|
+
}
|
|
153
|
+
for (const [index, tool] of value.backend.toolCatalog.entries()) {
|
|
154
|
+
if (!isRecord(tool))
|
|
155
|
+
return { ok: false, error: `prepare request backend.toolCatalog[${index}] must be an object.` };
|
|
156
|
+
const toolKeys = assertExactKeys(tool, FORGE_TOOL_FIELDS, `prepare request backend.toolCatalog[${index}]`);
|
|
157
|
+
if (toolKeys)
|
|
158
|
+
return toolKeys;
|
|
159
|
+
if (typeof tool.id !== "string" || !tool.id.trim()) {
|
|
160
|
+
return { ok: false, error: `prepare request backend.toolCatalog[${index}].id must be a non-empty string.` };
|
|
161
|
+
}
|
|
162
|
+
if (tool.name !== undefined && typeof tool.name !== "string") {
|
|
163
|
+
return { ok: false, error: `prepare request backend.toolCatalog[${index}].name must be a string when provided.` };
|
|
164
|
+
}
|
|
165
|
+
if (tool.effects !== undefined && (!Array.isArray(tool.effects) || tool.effects.some((effect) => typeof effect !== "string"))) {
|
|
166
|
+
return { ok: false, error: `prepare request backend.toolCatalog[${index}].effects must be an array of strings when provided.` };
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (!isJsonCompatible(value))
|
|
170
|
+
return { ok: false, error: "prepare request is not JSON-compatible." };
|
|
171
|
+
return { ok: true, data: value };
|
|
172
|
+
}
|
|
173
|
+
export function validatePrepareResponse(value) {
|
|
174
|
+
if (!isRecord(value))
|
|
175
|
+
return { ok: false, error: "prepare response must be an object." };
|
|
176
|
+
if (typeof value.profileId !== "string" || typeof value.systemPrompt !== "string"
|
|
177
|
+
|| !isRecord(value.model) || typeof value.model.provider !== "string" || typeof value.model.id !== "string"
|
|
178
|
+
|| typeof value.thinkingLevel !== "string" || typeof value.preparedAt !== "string"
|
|
179
|
+
|| !Array.isArray(value.messages) || !Array.isArray(value.effectiveToolIds)
|
|
180
|
+
|| !Array.isArray(value.effectiveToolNames) || !Array.isArray(value.diagnostics)
|
|
181
|
+
|| !isRecord(value.profileSnapshot)) {
|
|
182
|
+
return { ok: false, error: "prepare response is missing required fields." };
|
|
183
|
+
}
|
|
184
|
+
if (!isJsonCompatible(value))
|
|
185
|
+
return { ok: false, error: "prepare response is not JSON-compatible." };
|
|
186
|
+
return { ok: true, data: value };
|
|
187
|
+
}
|
|
188
|
+
function isRecord(value) {
|
|
189
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
190
|
+
}
|
|
191
|
+
/** Reject functions, symbols, bigint, undefined, non-finite numbers, and cycles. */
|
|
192
|
+
function isJsonCompatible(value, seen = new Set()) {
|
|
193
|
+
if (value === null)
|
|
194
|
+
return true;
|
|
195
|
+
if (typeof value === "string" || typeof value === "boolean")
|
|
196
|
+
return true;
|
|
197
|
+
if (typeof value === "number")
|
|
198
|
+
return Number.isFinite(value);
|
|
199
|
+
if (typeof value !== "object")
|
|
200
|
+
return false; // function, symbol, bigint, undefined
|
|
201
|
+
if (seen.has(value))
|
|
202
|
+
return false;
|
|
203
|
+
seen.add(value);
|
|
204
|
+
if (Array.isArray(value))
|
|
205
|
+
return value.every((item) => isJsonCompatible(item, seen));
|
|
206
|
+
const prototype = Object.getPrototypeOf(value);
|
|
207
|
+
// Only plain JSON object records; reject Date/Map/Set/class instances.
|
|
208
|
+
if (prototype !== Object.prototype && prototype !== null)
|
|
209
|
+
return false;
|
|
210
|
+
return Object.values(value).every((item) => isJsonCompatible(item, seen));
|
|
211
|
+
}
|
|
212
|
+
// ---------------------------------------------------------------------------
|
|
213
|
+
// Wire parsing.
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
function parseDiscover(data) {
|
|
216
|
+
if (!isRecord(data) || data.type !== "discover")
|
|
217
|
+
return undefined;
|
|
218
|
+
const { protocolVersion, minVersion, maxVersion, clientId } = data;
|
|
219
|
+
if (typeof protocolVersion !== "number" || typeof minVersion !== "number" || typeof maxVersion !== "number" || typeof clientId !== "string")
|
|
220
|
+
return undefined;
|
|
221
|
+
return { type: "discover", protocolVersion, minVersion, maxVersion, clientId };
|
|
222
|
+
}
|
|
223
|
+
function parseAvailable(data) {
|
|
224
|
+
if (!isRecord(data) || data.type !== "available")
|
|
225
|
+
return undefined;
|
|
226
|
+
const { hostId, protocolVersion, minVersion, maxVersion, capabilities, generation } = data;
|
|
227
|
+
if (typeof hostId !== "string" || typeof protocolVersion !== "number" || typeof minVersion !== "number"
|
|
228
|
+
|| typeof maxVersion !== "number" || !Array.isArray(capabilities) || capabilities.some((cap) => typeof cap !== "string") || typeof generation !== "number") {
|
|
229
|
+
return undefined;
|
|
230
|
+
}
|
|
231
|
+
return { type: "available", hostId, protocolVersion, minVersion, maxVersion, capabilities, generation };
|
|
232
|
+
}
|
|
233
|
+
function parseRequest(data) {
|
|
234
|
+
if (!isRecord(data) || data.type !== "request")
|
|
235
|
+
return undefined;
|
|
236
|
+
const { requestId, hostId, generation, operation, payload } = data;
|
|
237
|
+
if (typeof requestId !== "string" || typeof hostId !== "string" || typeof generation !== "number" || typeof operation !== "string")
|
|
238
|
+
return undefined;
|
|
239
|
+
return { type: "request", requestId, hostId, generation, operation, payload };
|
|
240
|
+
}
|
|
241
|
+
function parseReply(data) {
|
|
242
|
+
if (!isRecord(data) || data.type !== "reply")
|
|
243
|
+
return undefined;
|
|
244
|
+
const { requestId, hostId, generation, ok } = data;
|
|
245
|
+
if (typeof requestId !== "string" || typeof hostId !== "string" || typeof generation !== "number" || typeof ok !== "boolean")
|
|
246
|
+
return undefined;
|
|
247
|
+
return {
|
|
248
|
+
type: "reply",
|
|
249
|
+
requestId,
|
|
250
|
+
hostId,
|
|
251
|
+
generation,
|
|
252
|
+
ok,
|
|
253
|
+
data: ok ? data.data : undefined,
|
|
254
|
+
error: ok ? undefined : typeof data.error === "string" ? data.error : undefined,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
function parseUnavailable(data) {
|
|
258
|
+
if (!isRecord(data) || data.type !== "unavailable")
|
|
259
|
+
return undefined;
|
|
260
|
+
const { hostId, generation } = data;
|
|
261
|
+
if (typeof hostId !== "string" || typeof generation !== "number")
|
|
262
|
+
return undefined;
|
|
263
|
+
return { type: "unavailable", hostId, generation };
|
|
264
|
+
}
|
|
265
|
+
function versionCompatible(hostMin, hostMax, wantMin, wantMax) {
|
|
266
|
+
return hostMax >= wantMin && wantMax >= hostMin;
|
|
267
|
+
}
|
|
268
|
+
function normalizeHostResult(result) {
|
|
269
|
+
if (isRecord(result) && result.ok === true)
|
|
270
|
+
return { ok: true, data: result.data };
|
|
271
|
+
if (isRecord(result) && result.ok === false) {
|
|
272
|
+
return { ok: false, error: typeof result.error === "string" && result.error ? result.error : "Forge host operation failed." };
|
|
273
|
+
}
|
|
274
|
+
return { ok: false, error: "Forge host returned a malformed operation result." };
|
|
275
|
+
}
|
|
276
|
+
const DEFAULT_CLIENT_TIMEOUT_MS = 2_000;
|
|
277
|
+
// ---------------------------------------------------------------------------
|
|
278
|
+
// Host side.
|
|
279
|
+
// ---------------------------------------------------------------------------
|
|
280
|
+
export class ForgeHost {
|
|
281
|
+
transport;
|
|
282
|
+
options;
|
|
283
|
+
hostId;
|
|
284
|
+
generationId = 1;
|
|
285
|
+
started = false;
|
|
286
|
+
unsubscribers = [];
|
|
287
|
+
constructor(transport, options) {
|
|
288
|
+
this.transport = transport;
|
|
289
|
+
this.options = options;
|
|
290
|
+
this.hostId = options.hostId ?? `forge-host-${randomUUID()}`;
|
|
291
|
+
}
|
|
292
|
+
get generation() {
|
|
293
|
+
return this.generationId;
|
|
294
|
+
}
|
|
295
|
+
get isLive() {
|
|
296
|
+
return this.started;
|
|
297
|
+
}
|
|
298
|
+
availableMessage() {
|
|
299
|
+
return {
|
|
300
|
+
type: "available",
|
|
301
|
+
hostId: this.hostId,
|
|
302
|
+
protocolVersion: FORGE_HOST_PORT_VERSION,
|
|
303
|
+
minVersion: this.options.minVersion ?? FORGE_HOST_PORT_VERSION,
|
|
304
|
+
maxVersion: this.options.maxVersion ?? FORGE_HOST_PORT_VERSION,
|
|
305
|
+
capabilities: [...(this.options.capabilities ?? FORGE_HOST_PORT_OPERATIONS)],
|
|
306
|
+
generation: this.generationId,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
start() {
|
|
310
|
+
if (this.started)
|
|
311
|
+
return;
|
|
312
|
+
this.started = true;
|
|
313
|
+
this.unsubscribers.push(this.transport.on(FORGE_HOST_CHANNEL.discover, (data) => this.onDiscover(data)));
|
|
314
|
+
this.unsubscribers.push(this.transport.on(FORGE_HOST_CHANNEL.request, (data) => this.onRequest(data)));
|
|
315
|
+
this.transport.emit(FORGE_HOST_CHANNEL.available, this.availableMessage());
|
|
316
|
+
}
|
|
317
|
+
stop() {
|
|
318
|
+
if (!this.started)
|
|
319
|
+
return;
|
|
320
|
+
this.started = false;
|
|
321
|
+
for (const unsubscribe of this.unsubscribers.splice(0))
|
|
322
|
+
unsubscribe();
|
|
323
|
+
this.transport.emit(FORGE_HOST_CHANNEL.unavailable, {
|
|
324
|
+
type: "unavailable",
|
|
325
|
+
hostId: this.hostId,
|
|
326
|
+
generation: this.generationId,
|
|
327
|
+
});
|
|
328
|
+
this.generationId += 1;
|
|
329
|
+
}
|
|
330
|
+
onDiscover(data) {
|
|
331
|
+
if (!this.started)
|
|
332
|
+
return;
|
|
333
|
+
const message = parseDiscover(data);
|
|
334
|
+
if (!message || message.protocolVersion !== FORGE_HOST_PORT_VERSION)
|
|
335
|
+
return;
|
|
336
|
+
if (!versionCompatible(this.options.minVersion ?? FORGE_HOST_PORT_VERSION, this.options.maxVersion ?? FORGE_HOST_PORT_VERSION, message.minVersion, message.maxVersion)) {
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
this.transport.emit(FORGE_HOST_CHANNEL.available, this.availableMessage());
|
|
340
|
+
}
|
|
341
|
+
onRequest(data) {
|
|
342
|
+
if (!this.started)
|
|
343
|
+
return;
|
|
344
|
+
const message = parseRequest(data);
|
|
345
|
+
if (!message)
|
|
346
|
+
return;
|
|
347
|
+
// Requests are bound to this host identity and generation; a stale or
|
|
348
|
+
// foreign-generation request must never reach the handler.
|
|
349
|
+
if (message.hostId !== this.hostId || message.generation !== this.generationId)
|
|
350
|
+
return;
|
|
351
|
+
let result;
|
|
352
|
+
try {
|
|
353
|
+
result = typeof this.options.handle === "function"
|
|
354
|
+
? this.options.handle(message.operation, message.payload)
|
|
355
|
+
: { ok: false, error: "Forge host has no operation handler." };
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
result = { ok: false, error: `Forge host operation threw: ${error instanceof Error ? error.message : String(error)}` };
|
|
359
|
+
}
|
|
360
|
+
this.transport.emit(FORGE_HOST_CHANNEL.reply, {
|
|
361
|
+
...normalizeHostResult(result),
|
|
362
|
+
type: "reply",
|
|
363
|
+
requestId: message.requestId,
|
|
364
|
+
hostId: this.hostId,
|
|
365
|
+
generation: this.generationId,
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
export class ForgeHostClient {
|
|
370
|
+
transport;
|
|
371
|
+
clientId;
|
|
372
|
+
defaultTimeoutMs;
|
|
373
|
+
discoverSettleMs;
|
|
374
|
+
connectionUnsubscribe;
|
|
375
|
+
unavailableHandlers = [];
|
|
376
|
+
activeConnection;
|
|
377
|
+
constructor(transport, options = {}) {
|
|
378
|
+
this.transport = transport;
|
|
379
|
+
this.clientId = options.clientId ?? `forge-client-${randomUUID()}`;
|
|
380
|
+
this.defaultTimeoutMs = options.defaultTimeoutMs ?? DEFAULT_CLIENT_TIMEOUT_MS;
|
|
381
|
+
this.discoverSettleMs = options.discoverSettleMs ?? 25;
|
|
382
|
+
}
|
|
383
|
+
onUnavailable(handler) {
|
|
384
|
+
if (this.connectionUnsubscribe === undefined) {
|
|
385
|
+
this.connectionUnsubscribe = this.transport.on(FORGE_HOST_CHANNEL.unavailable, (data) => this.onUnavailableMessage(data));
|
|
386
|
+
}
|
|
387
|
+
this.unavailableHandlers.push(handler);
|
|
388
|
+
let removed = false;
|
|
389
|
+
return () => {
|
|
390
|
+
if (removed)
|
|
391
|
+
return;
|
|
392
|
+
removed = true;
|
|
393
|
+
const index = this.unavailableHandlers.indexOf(handler);
|
|
394
|
+
if (index !== -1)
|
|
395
|
+
this.unavailableHandlers.splice(index, 1);
|
|
396
|
+
if (this.unavailableHandlers.length === 0 && this.activeConnection === undefined) {
|
|
397
|
+
this.teardownPersistentListener();
|
|
398
|
+
}
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
teardownPersistentListener() {
|
|
402
|
+
if (this.connectionUnsubscribe !== undefined) {
|
|
403
|
+
this.connectionUnsubscribe();
|
|
404
|
+
this.connectionUnsubscribe = undefined;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
onUnavailableMessage(data) {
|
|
408
|
+
const message = parseUnavailable(data);
|
|
409
|
+
if (!message)
|
|
410
|
+
return;
|
|
411
|
+
if (this.activeConnection && message.hostId === this.activeConnection.hostId && message.generation === this.activeConnection.generation) {
|
|
412
|
+
this.activeConnection = undefined;
|
|
413
|
+
for (const handler of [...this.unavailableHandlers]) {
|
|
414
|
+
try {
|
|
415
|
+
handler();
|
|
416
|
+
}
|
|
417
|
+
catch {
|
|
418
|
+
// A throwing client handler must not break host disposal dispatch.
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
async discover(timeoutMs) {
|
|
424
|
+
const expectedTimeout = timeoutMs ?? this.defaultTimeoutMs;
|
|
425
|
+
return new Promise((resolve, reject) => {
|
|
426
|
+
const hosts = new Map();
|
|
427
|
+
let settled = false;
|
|
428
|
+
let timer;
|
|
429
|
+
let settleTimer;
|
|
430
|
+
const settle = (error, connection) => {
|
|
431
|
+
if (settled)
|
|
432
|
+
return;
|
|
433
|
+
settled = true;
|
|
434
|
+
if (timer !== undefined)
|
|
435
|
+
clearTimeout(timer);
|
|
436
|
+
if (settleTimer !== undefined)
|
|
437
|
+
clearTimeout(settleTimer);
|
|
438
|
+
unsubscribeAll();
|
|
439
|
+
if (error)
|
|
440
|
+
reject(error);
|
|
441
|
+
else
|
|
442
|
+
resolve(connection);
|
|
443
|
+
};
|
|
444
|
+
const onAvailable = (data) => {
|
|
445
|
+
const message = parseAvailable(data);
|
|
446
|
+
if (!message || message.protocolVersion !== FORGE_HOST_PORT_VERSION)
|
|
447
|
+
return;
|
|
448
|
+
if (!versionCompatible(FORGE_HOST_PORT_VERSION, FORGE_HOST_PORT_VERSION, message.minVersion, message.maxVersion))
|
|
449
|
+
return;
|
|
450
|
+
const existing = hosts.get(message.hostId);
|
|
451
|
+
if (!existing || existing.generation !== message.generation) {
|
|
452
|
+
hosts.set(message.hostId, {
|
|
453
|
+
hostId: message.hostId,
|
|
454
|
+
protocolVersion: message.protocolVersion,
|
|
455
|
+
capabilities: message.capabilities,
|
|
456
|
+
generation: message.generation,
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
if (hosts.size > 1) {
|
|
460
|
+
settle(new ForgeHostPortError("duplicate", "Multiple compatible Forge hosts are live."));
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
if (settleTimer === undefined) {
|
|
464
|
+
settleTimer = setTimeout(() => settle(undefined, hosts.values().next().value), this.discoverSettleMs);
|
|
465
|
+
}
|
|
466
|
+
};
|
|
467
|
+
const unsubAvailable = this.transport.on(FORGE_HOST_CHANNEL.available, onAvailable);
|
|
468
|
+
const unsubUnavailable = this.transport.on(FORGE_HOST_CHANNEL.unavailable, (data) => {
|
|
469
|
+
const message = parseUnavailable(data);
|
|
470
|
+
const known = message ? hosts.get(message.hostId) : undefined;
|
|
471
|
+
if (known && message && message.generation === known.generation) {
|
|
472
|
+
settle(new ForgeHostPortError("unavailable", `Forge host ${message.hostId} became unavailable during discovery.`));
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
const unsubscribeAll = () => {
|
|
476
|
+
unsubAvailable();
|
|
477
|
+
unsubUnavailable();
|
|
478
|
+
};
|
|
479
|
+
timer = setTimeout(() => settle(new ForgeHostPortError("timeout", "Forge host discovery timed out.")), expectedTimeout);
|
|
480
|
+
this.transport.emit(FORGE_HOST_CHANNEL.discover, {
|
|
481
|
+
type: "discover",
|
|
482
|
+
protocolVersion: FORGE_HOST_PORT_VERSION,
|
|
483
|
+
minVersion: FORGE_HOST_PORT_VERSION,
|
|
484
|
+
maxVersion: FORGE_HOST_PORT_VERSION,
|
|
485
|
+
clientId: this.clientId,
|
|
486
|
+
});
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
connect(connection) {
|
|
490
|
+
if (this.activeConnection && this.activeConnection.hostId !== connection.hostId) {
|
|
491
|
+
throw new ForgeHostPortError("duplicate", "This client is already connected to another Forge host.");
|
|
492
|
+
}
|
|
493
|
+
this.activeConnection = connection;
|
|
494
|
+
if (this.connectionUnsubscribe === undefined) {
|
|
495
|
+
this.connectionUnsubscribe = this.transport.on(FORGE_HOST_CHANNEL.unavailable, (data) => this.onUnavailableMessage(data));
|
|
496
|
+
}
|
|
497
|
+
return connection;
|
|
498
|
+
}
|
|
499
|
+
async request(connection, operation, payload, timeoutMs) {
|
|
500
|
+
if (this.activeConnection !== connection) {
|
|
501
|
+
return { ok: false, error: `Forge host ${connection.hostId} is not the client's active connection.` };
|
|
502
|
+
}
|
|
503
|
+
if (!FORGE_HOST_PORT_OPERATIONS.includes(operation)) {
|
|
504
|
+
return { ok: false, error: `Unknown Forge host operation: ${operation}` };
|
|
505
|
+
}
|
|
506
|
+
const requestId = randomUUID();
|
|
507
|
+
const expectedTimeout = timeoutMs ?? this.defaultTimeoutMs;
|
|
508
|
+
return new Promise((resolve) => {
|
|
509
|
+
const unsubscribeReply = this.transport.on(FORGE_HOST_CHANNEL.reply, (data) => {
|
|
510
|
+
const message = parseReply(data);
|
|
511
|
+
if (!message
|
|
512
|
+
|| message.requestId !== requestId
|
|
513
|
+
|| message.hostId !== connection.hostId
|
|
514
|
+
|| message.generation !== connection.generation) {
|
|
515
|
+
return;
|
|
516
|
+
}
|
|
517
|
+
cleanup();
|
|
518
|
+
if (message.ok)
|
|
519
|
+
resolve({ ok: true, data: message.data });
|
|
520
|
+
else
|
|
521
|
+
resolve({ ok: false, error: message.error ?? "Forge host operation failed." });
|
|
522
|
+
});
|
|
523
|
+
const unsubscribeUnavailable = this.transport.on(FORGE_HOST_CHANNEL.unavailable, (data) => {
|
|
524
|
+
const message = parseUnavailable(data);
|
|
525
|
+
if (message && message.hostId === connection.hostId && message.generation === connection.generation) {
|
|
526
|
+
cleanup();
|
|
527
|
+
resolve({ ok: false, error: `Forge host ${connection.hostId} became unavailable.` });
|
|
528
|
+
}
|
|
529
|
+
});
|
|
530
|
+
let timer;
|
|
531
|
+
const cleanup = () => {
|
|
532
|
+
if (timer !== undefined)
|
|
533
|
+
clearTimeout(timer);
|
|
534
|
+
unsubscribeReply();
|
|
535
|
+
unsubscribeUnavailable();
|
|
536
|
+
};
|
|
537
|
+
timer = setTimeout(() => {
|
|
538
|
+
cleanup();
|
|
539
|
+
resolve({ ok: false, error: `Forge host operation ${operation} timed out.` });
|
|
540
|
+
}, expectedTimeout);
|
|
541
|
+
this.transport.emit(FORGE_HOST_CHANNEL.request, {
|
|
542
|
+
type: "request",
|
|
543
|
+
requestId,
|
|
544
|
+
hostId: connection.hostId,
|
|
545
|
+
generation: connection.generation,
|
|
546
|
+
operation,
|
|
547
|
+
payload,
|
|
548
|
+
});
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
disconnect() {
|
|
552
|
+
this.activeConnection = undefined;
|
|
553
|
+
this.teardownPersistentListener();
|
|
554
|
+
this.unavailableHandlers = [];
|
|
555
|
+
}
|
|
556
|
+
get subscriptionCount() {
|
|
557
|
+
return this.connectionUnsubscribe === undefined ? 0 : 1;
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
//# sourceMappingURL=host-port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-port.js","sourceRoot":"","sources":["../../src/subagent/host-port.ts"],"names":[],"mappings":"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"}
|
package/dist/subagent/index.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Versioned `/subagent` host port: the minimal Forge DTO host contract.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* the Forge host contracts: profiles, compilation, approval, and reporting.
|
|
4
|
+
* Wire messages, recursive validators, transport, and client/host lifecycle,
|
|
5
|
+
* plus the Forge-owned canonical fingerprint helpers used for host-issued
|
|
6
|
+
* profile snapshots. The main package carries no dependency on
|
|
7
|
+
* `@zihanw/pi-subagent-runtime`; the execution contract (request, preflight,
|
|
8
|
+
* plan, response, context, tool negotiation) lives in the optional
|
|
9
|
+
* `@zihanw/pi-forge-subagents` package, which consumes this port.
|
|
11
10
|
*/
|
|
12
|
-
export
|
|
13
|
-
export {
|
|
11
|
+
export { FORGE_HOST_CHANNEL, FORGE_HOST_PORT_NAMESPACE, FORGE_HOST_PORT_OPERATIONS, FORGE_HOST_PORT_VERSION, ForgeHost, ForgeHostClient, ForgeHostPortError, validateListProfilesRequest, validateListProfilesResponse, validatePrepareRequest, validatePrepareResponse, validateResolveProfileRequest, validateResolveProfileResponse, } from "./host-port.ts";
|
|
12
|
+
export type { ForgeDelegationDiagnostic, ForgeDelegationMessage, ForgeHostWireMessage, ForgeListProfilesResponse, ForgePrepareRequest, ForgePrepareResponse, ForgeProfileSnapshot, ForgeProfileSummary, ForgePromptAccessFacts, ForgePromptDependency, ForgePromptDependencyKind, ForgeBackendFacts, ForgeBackendTool, ForgeHostConnection, ForgeHostClientOptions, ForgeHostOptions, ForgeHostPortOperation, ForgeHostPortResult, ForgeHostTransport, ForgeResolveProfileRequest, ForgeResolveProfileResponse, ForgeWireAgentProfile, ForgeWirePromptStack, ValidationResult, } from "./host-port.ts";
|
|
13
|
+
export { SUBAGENT_FINGERPRINT_PREFIX, canonicalSubagentJson, subagentFingerprint, subagentPromptStackFingerprint, subagentSourceProfileFingerprint, type SubagentFingerprint, } from "./fingerprints.ts";
|
|
14
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/subagent/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/subagent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EACN,kBAAkB,EAClB,yBAAyB,EACzB,0BAA0B,EAC1B,uBAAuB,EACvB,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,2BAA2B,EAC3B,4BAA4B,EAC5B,sBAAsB,EACtB,uBAAuB,EACvB,6BAA6B,EAC7B,8BAA8B,GAC9B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACX,yBAAyB,EACzB,sBAAsB,EACtB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EAClB,0BAA0B,EAC1B,2BAA2B,EAC3B,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACN,2BAA2B,EAC3B,qBAAqB,EACrB,mBAAmB,EACnB,8BAA8B,EAC9B,gCAAgC,EAChC,KAAK,mBAAmB,GACxB,MAAM,mBAAmB,CAAC"}
|