@humain/humain-code 0.3.8 → 0.4.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 +38 -0
- package/dist/bundle/agent-monitor.js +1 -1
- package/dist/bundle/chunks/bedrock-converse-stream.js +18 -17
- package/dist/bundle/chunks/{chunk-REZ7FW4X.js → chunk-2KKLZK2N.js} +1 -1
- package/dist/bundle/chunks/{chunk-QWB2GGVH.js → chunk-2Q2O3GZ4.js} +721 -718
- package/dist/bundle/chunks/{chunk-3ZYKCI45.js → chunk-3ZI2TEVB.js} +1 -1
- package/dist/bundle/chunks/{chunk-YEG6NREY.js → chunk-DUZY4PDA.js} +16 -16
- package/dist/bundle/chunks/{chunk-QJZ5QYKE.js → chunk-E22S6D55.js} +1 -1
- package/dist/bundle/chunks/{chunk-74L7EWMA.js → chunk-E7WGCXWK.js} +1 -1
- package/dist/bundle/chunks/{chunk-MNB52OYZ.js → chunk-ERT2BD7V.js} +36 -36
- package/dist/bundle/chunks/{chunk-2KVH67UZ.js → chunk-H5CZL7M5.js} +1 -1
- package/dist/bundle/chunks/{chunk-WQN4VIAM.js → chunk-HA5AW36V.js} +396 -355
- package/dist/bundle/chunks/{chunk-HL54JCNV.js → chunk-IAI7MTU4.js} +3 -3
- package/dist/bundle/chunks/{chunk-TEOX3AWC.js → chunk-ICLZNV4V.js} +2 -2
- package/dist/bundle/chunks/{chunk-VHVY22A2.js → chunk-JQZ7BIAI.js} +2 -13
- package/dist/bundle/chunks/{chunk-6HQRNHO7.js → chunk-N23FFKJU.js} +40 -25
- package/dist/bundle/chunks/{chunk-X5JUC5RE.js → chunk-OXJXKCLB.js} +1 -1
- package/dist/bundle/chunks/{chunk-7CYWKPFS.js → chunk-UBQSONVR.js} +9 -8
- package/dist/bundle/chunks/{chunk-6MMGBL46.js → chunk-VZV7GLZT.js} +2 -2
- package/dist/bundle/chunks/{chunk-FF26YENK.js → chunk-W2QRCQBX.js} +4 -3
- package/dist/bundle/chunks/{cli-5NYUGRWC.js → cli-5YRA5PFB.js} +2 -2
- package/dist/bundle/chunks/{compat-UPJNJCGF.js → compat-TCOK5LFD.js} +1 -1
- package/dist/bundle/chunks/dist-33CBPO23.js +1928 -0
- package/dist/bundle/chunks/{easter-egg-3d-XUJ4HNAR.js → easter-egg-3d-ARXMB2RN.js} +1 -1
- package/dist/bundle/chunks/{esm-763X2IA7.js → esm-NCUV2DF7.js} +1 -1
- package/dist/bundle/chunks/{event-streams-4Q22QRY2.js → event-streams-CGCQQL5M.js} +1 -1
- package/dist/bundle/chunks/{execute-IAU7EI3P.js → execute-KEUC5IWA.js} +1 -1
- package/dist/bundle/chunks/{extract-QIC545HI.js → extract-WUAT5T4V.js} +4 -4
- package/dist/bundle/chunks/{google-generative-ai-ICWD4YIE.js → google-generative-ai-MDUVUFFQ.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-XIACVW6H.js → google-vertex-UQGG6LEW.js} +1 -1
- package/dist/bundle/chunks/{host-QBIXSMNN.js → host-SPBJ4YAA.js} +1 -1
- package/dist/bundle/chunks/{node-W47VUEGE.js → node-XGNY74WT.js} +1 -1
- package/dist/bundle/chunks/{runtime-NBGMTCI6.js → runtime-HBWXEJT3.js} +1 -1
- package/dist/bundle/chunks/{virtual-modules-P2MH665T.js → virtual-modules-I5YD7JGC.js} +2 -2
- package/dist/bundle/cli-runtime.js +2 -2
- package/dist/bundle/flow/agents/.gitkeep +0 -0
- package/dist/bundle/flow/agents/orch-architect.md +33 -0
- package/dist/bundle/flow/agents/orch-implementation-fast.md +13 -0
- package/dist/bundle/flow/agents/orch-implementation-strong.md +28 -0
- package/dist/bundle/flow/agents/orch-qa-agent.md +29 -0
- package/dist/bundle/flow/agents/orch-scout.md +35 -0
- package/dist/bundle/flow/agents/orch-security-review.md +28 -0
- package/dist/bundle/flow/agents/orch-technical-lead.md +37 -0
- package/dist/bundle/flow/agents/orch-technical-review.md +28 -0
- package/dist/bundle/flow/agents/orch-worker.md +13 -0
- package/dist/bundle/flow/agents/orchestrator-lead.md +55 -0
- package/dist/bundle/flow/assets/.gitkeep +0 -0
- package/dist/bundle/flow/assets/contract.json +84 -0
- package/dist/bundle/flow/assets/forge-protocol-schema.sha256 +1 -0
- package/dist/bundle/flow/assets/method.json +193 -0
- package/dist/bundle/flow/assets/orchestrator-profiles.json +131 -0
- package/dist/bundle/flow/assets/profiles/anthropic.json +189 -0
- package/dist/bundle/flow/assets/profiles/openai.json +177 -0
- package/dist/bundle/flow/assets/profiles/oss-first.json +236 -0
- package/dist/bundle/flow/assets/profiles/premium.json +203 -0
- package/dist/bundle/flow/package.json +48 -0
- package/dist/bundle/index.js +5 -5
- package/dist/bundle/rpc-entry.js +2 -2
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +21 -0
- package/dist/config.js.map +1 -1
- package/dist/core/tools/subagent.d.ts +20 -0
- package/dist/core/tools/subagent.d.ts.map +1 -1
- package/dist/core/tools/subagent.js +124 -12
- package/dist/core/tools/subagent.js.map +1 -1
- package/dist/humain/flow-loader.d.ts +62 -0
- package/dist/humain/flow-loader.d.ts.map +1 -0
- package/dist/humain/flow-loader.js +291 -0
- package/dist/humain/flow-loader.js.map +1 -0
- package/dist/humain/index.d.ts.map +1 -1
- package/dist/humain/index.js +2 -0
- package/dist/humain/index.js.map +1 -1
- package/dist/humain/trace-capture/child-launch.d.ts +1 -0
- package/dist/humain/trace-capture/child-launch.d.ts.map +1 -1
- package/dist/humain/trace-capture/child-launch.js +2 -1
- package/dist/humain/trace-capture/child-launch.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +136 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/docs/docs.json +8 -0
- package/docs/environment-variables.md +1 -0
- package/docs/flow-profiles.md +173 -0
- package/docs/flow.md +112 -0
- package/docs/index.md +2 -0
- package/npm-shrinkwrap.json +6 -6
- package/package.json +6 -5
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { FlowEventFrameV1, FlowReceiptV1, FlowStatusV1 } from "@humain/humain-code-contracts/flow-control";
|
|
2
|
+
import type { ExtensionCommandContext, ExtensionFactory } from "../core/extensions/types.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Lazy loader for the private @humain/flow package.
|
|
5
|
+
*
|
|
6
|
+
* The CLI entry graph must not statically reach Flow: this module registers cheap stub commands and a flag, and
|
|
7
|
+
* only loads Flow (one memoized dynamic import) the first time a stub runs. Flow is bundled as its own chunk.
|
|
8
|
+
*/
|
|
9
|
+
export declare const HUMAIN_FLOW_DISABLED_ENV = "HUMAIN_TERMINAL_FLOW_DISABLED";
|
|
10
|
+
export declare const HUMAIN_FLOW_PACKAGE_DIR_ENV = "HUMAIN_TERMINAL_FLOW_PACKAGE_DIR";
|
|
11
|
+
/** Run-control surface Flow exposes to rpc mode (flow_status/pause/resume/cancel/message). */
|
|
12
|
+
export interface FlowRpcControl {
|
|
13
|
+
handle(input: unknown): Promise<{
|
|
14
|
+
receipt: FlowReceiptV1;
|
|
15
|
+
status?: FlowStatusV1;
|
|
16
|
+
}>;
|
|
17
|
+
activeRunId(): string | undefined;
|
|
18
|
+
}
|
|
19
|
+
export interface FlowModule {
|
|
20
|
+
flowExtension: ExtensionFactory;
|
|
21
|
+
/** Documented rpc hook: called once when Flow loads; `writeFrame` carries `flow_event` frames to the rpc host. */
|
|
22
|
+
createFlowRpcControl?(options: {
|
|
23
|
+
writeFrame?: (frame: FlowEventFrameV1) => void | Promise<void>;
|
|
24
|
+
isDisabled?: () => boolean;
|
|
25
|
+
/** Queues text on the host session as a follow-up (flow_message with no active run). */
|
|
26
|
+
sendFollowUp?: (text: string) => Promise<void>;
|
|
27
|
+
}): FlowRpcControl;
|
|
28
|
+
/** B1 profile command; optional so test fakes need not provide it. Methods stay bivariant for the real signatures. */
|
|
29
|
+
runFlowProfileCommand?(args: string, ctx: ExtensionCommandContext, deps: {
|
|
30
|
+
store: unknown;
|
|
31
|
+
}): Promise<unknown>;
|
|
32
|
+
createProfileStore?(options: {
|
|
33
|
+
flowDir: string;
|
|
34
|
+
builtInDir?: string;
|
|
35
|
+
}): unknown;
|
|
36
|
+
}
|
|
37
|
+
export interface HumainFlowLoaderOptions {
|
|
38
|
+
/** Test seam. Defaults to the single sanctioned dynamic import of @humain/flow. */
|
|
39
|
+
importFlow?: () => Promise<FlowModule>;
|
|
40
|
+
env?: NodeJS.ProcessEnv;
|
|
41
|
+
/** Directory holding Flow's agents/assets/package.json. Defaults to the bundled layout's flow/ dir. */
|
|
42
|
+
flowPackageDir?: string;
|
|
43
|
+
/** Built-in Flow profiles dir. Defaults to the bundled layout's assets/profiles; undefined lets Flow find its own. */
|
|
44
|
+
builtInProfilesDir?: string;
|
|
45
|
+
/** Flow profile store directory. Defaults to `<agentDir>/flow`. */
|
|
46
|
+
flowDir?: string;
|
|
47
|
+
}
|
|
48
|
+
/** The documented rpc hook: rpc mode reads Flow's run control here and never imports Flow itself. */
|
|
49
|
+
export declare function getFlowRpcControl(): FlowRpcControl | undefined;
|
|
50
|
+
/**
|
|
51
|
+
* The documented rpc hook: loads Flow through the same lazy-load path the stub commands use and returns its run control.
|
|
52
|
+
* Undefined when Flow is disabled (never loaded then), not wired, or fails to load.
|
|
53
|
+
*/
|
|
54
|
+
export declare function loadFlowRpcControl(): Promise<FlowRpcControl | undefined>;
|
|
55
|
+
/** True while Flow is switched off (flow.enabled=false or the env kill switch); rpc mode refuses flow_resume then. */
|
|
56
|
+
export declare function isFlowDisabled(): boolean;
|
|
57
|
+
/** The documented rpc hook: rpc mode registers where Flow's `flow_event` frames are written. */
|
|
58
|
+
export declare function setFlowRpcOutput(writer: ((frame: FlowEventFrameV1) => void | Promise<void>) | undefined): void;
|
|
59
|
+
/** The documented rpc hook: rpc mode registers how direct-mode flow_message text is queued as a host follow-up. */
|
|
60
|
+
export declare function setFlowRpcFollowUp(queue: ((text: string) => Promise<void>) | undefined): void;
|
|
61
|
+
export declare function createHumainFlowLoaderExtensionFactory(options?: HumainFlowLoaderOptions): ExtensionFactory;
|
|
62
|
+
//# sourceMappingURL=flow-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-loader.d.ts","sourceRoot":"","sources":["../../src/humain/flow-loader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAEhH,OAAO,KAAK,EAEX,uBAAuB,EACvB,gBAAgB,EAEhB,MAAM,6BAA6B,CAAC;AAErC;;;;;GAKG;AAEH,eAAO,MAAM,wBAAwB,kCAAkC,CAAC;AACxE,eAAO,MAAM,2BAA2B,qCAAqC,CAAC;AAE9E,8FAA8F;AAC9F,MAAM,WAAW,cAAc;IAC9B,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,aAAa,CAAC;QAAC,MAAM,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IACnF,WAAW,IAAI,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IAC1B,aAAa,EAAE,gBAAgB,CAAC;IAChC,kHAAkH;IAClH,oBAAoB,CAAC,CAAC,OAAO,EAAE;QAC9B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/D,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;QAC3B,wFAAwF;QACxF,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC/C,GAAG,cAAc,CAAC;IACnB,sHAAsH;IACtH,qBAAqB,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,uBAAuB,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/G,kBAAkB,CAAC,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;CAChF;AAED,MAAM,WAAW,uBAAuB;IACvC,mFAAmF;IACnF,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,uGAAuG;IACvG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sHAAsH;IACtH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAQD,qGAAqG;AACrG,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,SAAS,CAE9D;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAI9E;AAED,sHAAsH;AACtH,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,gGAAgG;AAChG,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAE9G;AAED,mHAAmH;AACnH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAE7F;AAgKD,wBAAgB,sCAAsC,CAAC,OAAO,GAAE,uBAA4B,GAAG,gBAAgB,CAmH9G"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { getAgentDir, getBundledFlowPackageDir, getBundledFlowProfilesDir } from "../config.js";
|
|
3
|
+
/**
|
|
4
|
+
* Lazy loader for the private @humain/flow package.
|
|
5
|
+
*
|
|
6
|
+
* The CLI entry graph must not statically reach Flow: this module registers cheap stub commands and a flag, and
|
|
7
|
+
* only loads Flow (one memoized dynamic import) the first time a stub runs. Flow is bundled as its own chunk.
|
|
8
|
+
*/
|
|
9
|
+
export const HUMAIN_FLOW_DISABLED_ENV = "HUMAIN_TERMINAL_FLOW_DISABLED";
|
|
10
|
+
export const HUMAIN_FLOW_PACKAGE_DIR_ENV = "HUMAIN_TERMINAL_FLOW_PACKAGE_DIR";
|
|
11
|
+
let rpcControl;
|
|
12
|
+
let disabledProbe;
|
|
13
|
+
let rpcOutput;
|
|
14
|
+
let rpcLoader;
|
|
15
|
+
let rpcFollowUp;
|
|
16
|
+
/** The documented rpc hook: rpc mode reads Flow's run control here and never imports Flow itself. */
|
|
17
|
+
export function getFlowRpcControl() {
|
|
18
|
+
return rpcControl;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The documented rpc hook: loads Flow through the same lazy-load path the stub commands use and returns its run control.
|
|
22
|
+
* Undefined when Flow is disabled (never loaded then), not wired, or fails to load.
|
|
23
|
+
*/
|
|
24
|
+
export async function loadFlowRpcControl() {
|
|
25
|
+
if (rpcControl)
|
|
26
|
+
return rpcControl;
|
|
27
|
+
if (isFlowDisabled())
|
|
28
|
+
return undefined;
|
|
29
|
+
return rpcLoader?.();
|
|
30
|
+
}
|
|
31
|
+
/** True while Flow is switched off (flow.enabled=false or the env kill switch); rpc mode refuses flow_resume then. */
|
|
32
|
+
export function isFlowDisabled() {
|
|
33
|
+
return disabledProbe?.() ?? false;
|
|
34
|
+
}
|
|
35
|
+
/** The documented rpc hook: rpc mode registers where Flow's `flow_event` frames are written. */
|
|
36
|
+
export function setFlowRpcOutput(writer) {
|
|
37
|
+
rpcOutput = writer;
|
|
38
|
+
}
|
|
39
|
+
/** The documented rpc hook: rpc mode registers how direct-mode flow_message text is queued as a host follow-up. */
|
|
40
|
+
export function setFlowRpcFollowUp(queue) {
|
|
41
|
+
rpcFollowUp = queue;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* ExtensionAPI members that only record registrations (see core/extensions/loader.ts). They are staged while Flow's
|
|
45
|
+
* factory runs and applied to the real pi only after the factory and the session_start replay succeed. Reads and
|
|
46
|
+
* actions (getFlag, getSettings, exec, sendMessage, ...) and `events` stay live: they have no registration to undo
|
|
47
|
+
* or are needed by the factory itself. Flow uses none of the live ones that subscribe (`events.on`).
|
|
48
|
+
*/
|
|
49
|
+
const STAGED_MEMBERS = new Set([
|
|
50
|
+
"on",
|
|
51
|
+
"registerTool",
|
|
52
|
+
"registerCommand",
|
|
53
|
+
"registerShortcut",
|
|
54
|
+
"registerFlag",
|
|
55
|
+
"registerMessageRenderer",
|
|
56
|
+
"registerMarkdownTransformer",
|
|
57
|
+
"registerEntryRenderer",
|
|
58
|
+
"registerProvider",
|
|
59
|
+
"unregisterProvider",
|
|
60
|
+
"registerMcpServer",
|
|
61
|
+
"unregisterMcpServer",
|
|
62
|
+
"registerVirtualModel",
|
|
63
|
+
"unregisterVirtualModel",
|
|
64
|
+
]);
|
|
65
|
+
// Descriptions match the real Flow commands (packages/flow/src). flow-profile is served here through Flow's
|
|
66
|
+
// runFlowProfileCommand.
|
|
67
|
+
const STUB_COMMANDS = {
|
|
68
|
+
flow: "Plan and dispatch a hierarchical agent run. " +
|
|
69
|
+
"Args: <goal> [--task-class T] [--complexity N] [--risk low|medium|high|critical] " +
|
|
70
|
+
"[--profile NAME] [--lead-size small|standard|large] [--cheap ALIAS] [--mid ALIAS] [--premium ALIAS] [--frontier ALIAS] [--model <capability>=ALIAS] [--effort LEVEL] " +
|
|
71
|
+
"[--quality-floor F] [--cost-aggressiveness C] [--max-retries R] [--flow-admission FILE] " +
|
|
72
|
+
"[--context FILE ...] [--with-last-reply] [--force]\n\n" +
|
|
73
|
+
"With no triage flags, an LLM triage call (cheapest configured model) " +
|
|
74
|
+
"auto-fills task_class, complexity, and risk from the goal text. " +
|
|
75
|
+
"Models: flags > profile (orchestrator-profiles.json) > cost-tier resolver. See /flow-models.",
|
|
76
|
+
"flow-continue": "Preview and explicitly confirm recovery in the original checkout. Args: [run-id] (no --yes or --force).",
|
|
77
|
+
"flow-status": "Open the full live orchestration board (↑↓ PgUp/PgDn scroll, Esc closes without cancelling).",
|
|
78
|
+
"flow-cancel": "Cancel the currently running /flow run, if any.",
|
|
79
|
+
"flow-pause": "Pause the currently running /flow run, if any.",
|
|
80
|
+
"flow-resume": "Resume a paused /flow run.",
|
|
81
|
+
"flow-title": "Rename the active flow and display its title on the widget border.",
|
|
82
|
+
"flow-models": "Manage which models /flow uses. Subcommands: show|list|validate [--live]|check|set|effort|use|new|pick|workflow. " +
|
|
83
|
+
"Aliases like fable-5-1, opus-5-5, sonnet-5, gpt-6-sol, gpt-6-luna, astra resolve against your configured models.",
|
|
84
|
+
"flow-profile": "List, show, select, import or edit Flow profiles. Args: [list|show|use|export|import|validate ...]",
|
|
85
|
+
omsg: "Send a message to the running orchestration (queued, delivered to the next dispatched task). " +
|
|
86
|
+
"Usage: /omsg <text> — the lead will see and respond to it. Use '\\n' for newlines if needed.",
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Act on an already loaded run only; with Flow not loaded there is no run, so Flow is never imported for them. They
|
|
90
|
+
* stay reachable when Flow is disabled so a live run can still be stopped. Every other stub is refused when disabled.
|
|
91
|
+
*/
|
|
92
|
+
const LOADED_RUN_COMMANDS = new Set(["flow-cancel", "flow-status", "flow-pause", "flow-resume"]);
|
|
93
|
+
/** Kill switch: resume would restart dispatch, so it is refused while Flow is disabled (cancel, status and pause are not). */
|
|
94
|
+
const AVAILABLE_WHEN_DISABLED = new Set(["flow-cancel", "flow-status", "flow-pause"]);
|
|
95
|
+
function isRecord(value) {
|
|
96
|
+
return typeof value === "object" && value !== null;
|
|
97
|
+
}
|
|
98
|
+
function disabledReason(pi, env) {
|
|
99
|
+
const raw = env[HUMAIN_FLOW_DISABLED_ENV]?.trim().toLowerCase();
|
|
100
|
+
if (raw === "1" || raw === "true")
|
|
101
|
+
return `${HUMAIN_FLOW_DISABLED_ENV}=${raw}`;
|
|
102
|
+
try {
|
|
103
|
+
// `flow` is not a typed Settings key: settings.json keeps unknown keys, so read it raw.
|
|
104
|
+
const flow = pi.getSettings().flow;
|
|
105
|
+
if (isRecord(flow) && flow.enabled === false)
|
|
106
|
+
return "setting flow.enabled=false";
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Runtime not bound yet: treat as enabled.
|
|
110
|
+
}
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Run flowExtension against a staging proxy. Stub commands are captured (so names never double-register); every other
|
|
115
|
+
* registration is recorded and applied to the real pi only after the factory and the session_start replay succeed, so
|
|
116
|
+
* a failed attempt leaves nothing behind and a retry starts from scratch. Late registration is supported by the
|
|
117
|
+
* extension loader (handlers, tools, commands and flags are written to the live extension object), but
|
|
118
|
+
* `session_start` has already fired by the time Flow loads, so the last session_start event is replayed to Flow's
|
|
119
|
+
* staged session_start handlers.
|
|
120
|
+
*
|
|
121
|
+
* Commit is not transactional for non-handler members: if one throws midway, committed handlers are unsubscribed, and
|
|
122
|
+
* tools/commands/flags/shortcuts/renderers (keyed maps in the extension loader) are simply overwritten on retry.
|
|
123
|
+
*/
|
|
124
|
+
async function runFlowExtension(pi, flowExtension, lastSessionStart) {
|
|
125
|
+
const captured = new Map();
|
|
126
|
+
const staged = [];
|
|
127
|
+
// After a successful commit the proxy forwards live, so registrations made later (from handlers) reach the real pi.
|
|
128
|
+
let live = false;
|
|
129
|
+
const proxy = new Proxy(pi, {
|
|
130
|
+
get(target, prop) {
|
|
131
|
+
if (!live && typeof prop === "string" && STAGED_MEMBERS.has(prop)) {
|
|
132
|
+
return (...args) => {
|
|
133
|
+
if (prop === "registerCommand" && typeof args[0] === "string" && args[0] in STUB_COMMANDS) {
|
|
134
|
+
captured.set(args[0], args[1]);
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
const call = { member: prop, args, cancelled: false };
|
|
138
|
+
staged.push(call);
|
|
139
|
+
if (prop !== "on")
|
|
140
|
+
return undefined;
|
|
141
|
+
return () => {
|
|
142
|
+
call.cancelled = true;
|
|
143
|
+
call.unsubscribe?.();
|
|
144
|
+
};
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
const value = Reflect.get(target, prop, target);
|
|
148
|
+
return typeof value === "function" ? value.bind(target) : value;
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
await flowExtension(proxy);
|
|
152
|
+
let replayed;
|
|
153
|
+
for (let start = lastSessionStart(); start && start !== replayed; start = lastSessionStart()) {
|
|
154
|
+
replayed = start;
|
|
155
|
+
for (const call of staged) {
|
|
156
|
+
if (call.member === "on" && call.args[0] === "session_start" && !call.cancelled) {
|
|
157
|
+
await call.args[1](...start);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Synchronous from the last replay check: no session_start can slip between replay and commit.
|
|
162
|
+
const committed = [];
|
|
163
|
+
try {
|
|
164
|
+
for (const call of staged) {
|
|
165
|
+
if (call.cancelled)
|
|
166
|
+
continue;
|
|
167
|
+
const result = Reflect.get(pi, call.member).apply(pi, call.args);
|
|
168
|
+
if (call.member === "on") {
|
|
169
|
+
call.unsubscribe = result;
|
|
170
|
+
committed.push(call.unsubscribe);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
for (const unsubscribe of committed)
|
|
176
|
+
unsubscribe();
|
|
177
|
+
throw error;
|
|
178
|
+
}
|
|
179
|
+
live = true;
|
|
180
|
+
return captured;
|
|
181
|
+
}
|
|
182
|
+
export function createHumainFlowLoaderExtensionFactory(options = {}) {
|
|
183
|
+
const env = options.env ?? process.env;
|
|
184
|
+
// This is the single sanctioned lazy-load boundary for @humain/flow (see AGENTS.md "No inline imports" exception).
|
|
185
|
+
const importFlow = options.importFlow ?? (() => import("@humain/flow"));
|
|
186
|
+
const flowPackageDir = options.flowPackageDir ?? getBundledFlowPackageDir();
|
|
187
|
+
const builtInProfilesDir = options.builtInProfilesDir ?? getBundledFlowProfilesDir();
|
|
188
|
+
let flowModule;
|
|
189
|
+
return (pi) => {
|
|
190
|
+
disabledProbe = () => disabledReason(pi, env) !== undefined;
|
|
191
|
+
let lastStart;
|
|
192
|
+
let loaded;
|
|
193
|
+
pi.on("session_start", (event, ctx) => {
|
|
194
|
+
lastStart = [event, ctx];
|
|
195
|
+
});
|
|
196
|
+
pi.registerFlag("profile", { description: "Flow profile id", type: "string" });
|
|
197
|
+
pi.registerFlag("flow-admission", { description: "Flow run admission file (JSON)", type: "string" });
|
|
198
|
+
const loadModule = async () => {
|
|
199
|
+
if (flowPackageDir && !env[HUMAIN_FLOW_PACKAGE_DIR_ENV])
|
|
200
|
+
env[HUMAIN_FLOW_PACKAGE_DIR_ENV] = flowPackageDir;
|
|
201
|
+
flowModule ??= importFlow().then((module) => {
|
|
202
|
+
rpcControl = module.createFlowRpcControl?.({
|
|
203
|
+
writeFrame: (frame) => rpcOutput?.(frame),
|
|
204
|
+
isDisabled: isFlowDisabled,
|
|
205
|
+
sendFollowUp: (text) => rpcFollowUp ? rpcFollowUp(text) : Promise.reject(new Error("host unavailable")),
|
|
206
|
+
});
|
|
207
|
+
return module;
|
|
208
|
+
});
|
|
209
|
+
try {
|
|
210
|
+
return await flowModule;
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
flowModule = undefined;
|
|
214
|
+
throw error;
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
rpcLoader = async () => {
|
|
218
|
+
try {
|
|
219
|
+
await loadModule();
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
return undefined;
|
|
223
|
+
}
|
|
224
|
+
return rpcControl;
|
|
225
|
+
};
|
|
226
|
+
const load = () => {
|
|
227
|
+
if (!loaded) {
|
|
228
|
+
const attempt = (async () => {
|
|
229
|
+
const module = await loadModule();
|
|
230
|
+
return runFlowExtension(pi, module.flowExtension, () => lastStart);
|
|
231
|
+
})();
|
|
232
|
+
loaded = attempt;
|
|
233
|
+
// A failed load must be retryable on the next invocation.
|
|
234
|
+
attempt.catch(() => {
|
|
235
|
+
if (loaded === attempt)
|
|
236
|
+
loaded = undefined;
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
return loaded;
|
|
240
|
+
};
|
|
241
|
+
for (const [name, description] of Object.entries(STUB_COMMANDS)) {
|
|
242
|
+
pi.registerCommand(name, {
|
|
243
|
+
description,
|
|
244
|
+
handler: async (args, ctx) => {
|
|
245
|
+
const reason = AVAILABLE_WHEN_DISABLED.has(name) ? undefined : disabledReason(pi, env);
|
|
246
|
+
if (reason) {
|
|
247
|
+
ctx.ui.notify(`Flow disabled (${reason}). /${name} is unavailable.`, "warning");
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
if (name === "flow-profile") {
|
|
251
|
+
try {
|
|
252
|
+
const module = await loadModule();
|
|
253
|
+
if (!module.runFlowProfileCommand || !module.createProfileStore) {
|
|
254
|
+
ctx.ui.notify("/flow-profile is not available in this Flow build", "error");
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
const store = module.createProfileStore({
|
|
258
|
+
flowDir: options.flowDir ?? join(getAgentDir(), "flow"),
|
|
259
|
+
...(builtInProfilesDir !== undefined ? { builtInDir: builtInProfilesDir } : {}),
|
|
260
|
+
});
|
|
261
|
+
await module.runFlowProfileCommand(args, ctx, { store });
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
ctx.ui.notify(`/flow-profile failed: ${error instanceof Error ? error.message : String(error)}`, "error");
|
|
265
|
+
}
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
if (LOADED_RUN_COMMANDS.has(name) && !loaded) {
|
|
269
|
+
ctx.ui.notify("no active run", "info");
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
let commands;
|
|
273
|
+
try {
|
|
274
|
+
commands = await load();
|
|
275
|
+
}
|
|
276
|
+
catch (error) {
|
|
277
|
+
ctx.ui.notify(`Failed to load Flow: ${error instanceof Error ? error.message : String(error)}`, "error");
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
const real = commands.get(name);
|
|
281
|
+
if (!real) {
|
|
282
|
+
ctx.ui.notify(`/${name} is not available yet`, "error");
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
await real.handler(args, ctx);
|
|
286
|
+
},
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=flow-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-loader.js","sourceRoot":"","sources":["../../src/humain/flow-loader.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport type { FlowEventFrameV1, FlowReceiptV1, FlowStatusV1 } from \"@humain/humain-code-contracts/flow-control\";\nimport { getAgentDir, getBundledFlowPackageDir, getBundledFlowProfilesDir } from \"../config.ts\";\nimport type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionFactory,\n\tRegisteredCommand,\n} from \"../core/extensions/types.ts\";\n\n/**\n * Lazy loader for the private @humain/flow package.\n *\n * The CLI entry graph must not statically reach Flow: this module registers cheap stub commands and a flag, and\n * only loads Flow (one memoized dynamic import) the first time a stub runs. Flow is bundled as its own chunk.\n */\n\nexport const HUMAIN_FLOW_DISABLED_ENV = \"HUMAIN_TERMINAL_FLOW_DISABLED\";\nexport const HUMAIN_FLOW_PACKAGE_DIR_ENV = \"HUMAIN_TERMINAL_FLOW_PACKAGE_DIR\";\n\n/** Run-control surface Flow exposes to rpc mode (flow_status/pause/resume/cancel/message). */\nexport interface FlowRpcControl {\n\thandle(input: unknown): Promise<{ receipt: FlowReceiptV1; status?: FlowStatusV1 }>;\n\tactiveRunId(): string | undefined;\n}\n\nexport interface FlowModule {\n\tflowExtension: ExtensionFactory;\n\t/** Documented rpc hook: called once when Flow loads; `writeFrame` carries `flow_event` frames to the rpc host. */\n\tcreateFlowRpcControl?(options: {\n\t\twriteFrame?: (frame: FlowEventFrameV1) => void | Promise<void>;\n\t\tisDisabled?: () => boolean;\n\t\t/** Queues text on the host session as a follow-up (flow_message with no active run). */\n\t\tsendFollowUp?: (text: string) => Promise<void>;\n\t}): FlowRpcControl;\n\t/** B1 profile command; optional so test fakes need not provide it. Methods stay bivariant for the real signatures. */\n\trunFlowProfileCommand?(args: string, ctx: ExtensionCommandContext, deps: { store: unknown }): Promise<unknown>;\n\tcreateProfileStore?(options: { flowDir: string; builtInDir?: string }): unknown;\n}\n\nexport interface HumainFlowLoaderOptions {\n\t/** Test seam. Defaults to the single sanctioned dynamic import of @humain/flow. */\n\timportFlow?: () => Promise<FlowModule>;\n\tenv?: NodeJS.ProcessEnv;\n\t/** Directory holding Flow's agents/assets/package.json. Defaults to the bundled layout's flow/ dir. */\n\tflowPackageDir?: string;\n\t/** Built-in Flow profiles dir. Defaults to the bundled layout's assets/profiles; undefined lets Flow find its own. */\n\tbuiltInProfilesDir?: string;\n\t/** Flow profile store directory. Defaults to `<agentDir>/flow`. */\n\tflowDir?: string;\n}\n\nlet rpcControl: FlowRpcControl | undefined;\nlet disabledProbe: (() => boolean) | undefined;\nlet rpcOutput: ((frame: FlowEventFrameV1) => void | Promise<void>) | undefined;\nlet rpcLoader: (() => Promise<FlowRpcControl | undefined>) | undefined;\nlet rpcFollowUp: ((text: string) => Promise<void>) | undefined;\n\n/** The documented rpc hook: rpc mode reads Flow's run control here and never imports Flow itself. */\nexport function getFlowRpcControl(): FlowRpcControl | undefined {\n\treturn rpcControl;\n}\n\n/**\n * The documented rpc hook: loads Flow through the same lazy-load path the stub commands use and returns its run control.\n * Undefined when Flow is disabled (never loaded then), not wired, or fails to load.\n */\nexport async function loadFlowRpcControl(): Promise<FlowRpcControl | undefined> {\n\tif (rpcControl) return rpcControl;\n\tif (isFlowDisabled()) return undefined;\n\treturn rpcLoader?.();\n}\n\n/** True while Flow is switched off (flow.enabled=false or the env kill switch); rpc mode refuses flow_resume then. */\nexport function isFlowDisabled(): boolean {\n\treturn disabledProbe?.() ?? false;\n}\n\n/** The documented rpc hook: rpc mode registers where Flow's `flow_event` frames are written. */\nexport function setFlowRpcOutput(writer: ((frame: FlowEventFrameV1) => void | Promise<void>) | undefined): void {\n\trpcOutput = writer;\n}\n\n/** The documented rpc hook: rpc mode registers how direct-mode flow_message text is queued as a host follow-up. */\nexport function setFlowRpcFollowUp(queue: ((text: string) => Promise<void>) | undefined): void {\n\trpcFollowUp = queue;\n}\n\ntype CommandOptions = Omit<RegisteredCommand, \"name\" | \"sourceInfo\">;\ntype EventHandler = (...args: unknown[]) => unknown;\n\n/**\n * ExtensionAPI members that only record registrations (see core/extensions/loader.ts). They are staged while Flow's\n * factory runs and applied to the real pi only after the factory and the session_start replay succeed. Reads and\n * actions (getFlag, getSettings, exec, sendMessage, ...) and `events` stay live: they have no registration to undo\n * or are needed by the factory itself. Flow uses none of the live ones that subscribe (`events.on`).\n */\nconst STAGED_MEMBERS = new Set([\n\t\"on\",\n\t\"registerTool\",\n\t\"registerCommand\",\n\t\"registerShortcut\",\n\t\"registerFlag\",\n\t\"registerMessageRenderer\",\n\t\"registerMarkdownTransformer\",\n\t\"registerEntryRenderer\",\n\t\"registerProvider\",\n\t\"unregisterProvider\",\n\t\"registerMcpServer\",\n\t\"unregisterMcpServer\",\n\t\"registerVirtualModel\",\n\t\"unregisterVirtualModel\",\n]);\n\ninterface StagedCall {\n\tmember: string;\n\targs: unknown[];\n\tcancelled: boolean;\n\tunsubscribe?: () => void;\n}\n\n// Descriptions match the real Flow commands (packages/flow/src). flow-profile is served here through Flow's\n// runFlowProfileCommand.\nconst STUB_COMMANDS: Record<string, string> = {\n\tflow:\n\t\t\"Plan and dispatch a hierarchical agent run. \" +\n\t\t\"Args: <goal> [--task-class T] [--complexity N] [--risk low|medium|high|critical] \" +\n\t\t\"[--profile NAME] [--lead-size small|standard|large] [--cheap ALIAS] [--mid ALIAS] [--premium ALIAS] [--frontier ALIAS] [--model <capability>=ALIAS] [--effort LEVEL] \" +\n\t\t\"[--quality-floor F] [--cost-aggressiveness C] [--max-retries R] [--flow-admission FILE] \" +\n\t\t\"[--context FILE ...] [--with-last-reply] [--force]\\n\\n\" +\n\t\t\"With no triage flags, an LLM triage call (cheapest configured model) \" +\n\t\t\"auto-fills task_class, complexity, and risk from the goal text. \" +\n\t\t\"Models: flags > profile (orchestrator-profiles.json) > cost-tier resolver. See /flow-models.\",\n\t\"flow-continue\":\n\t\t\"Preview and explicitly confirm recovery in the original checkout. Args: [run-id] (no --yes or --force).\",\n\t\"flow-status\": \"Open the full live orchestration board (↑↓ PgUp/PgDn scroll, Esc closes without cancelling).\",\n\t\"flow-cancel\": \"Cancel the currently running /flow run, if any.\",\n\t\"flow-pause\": \"Pause the currently running /flow run, if any.\",\n\t\"flow-resume\": \"Resume a paused /flow run.\",\n\t\"flow-title\": \"Rename the active flow and display its title on the widget border.\",\n\t\"flow-models\":\n\t\t\"Manage which models /flow uses. Subcommands: show|list|validate [--live]|check|set|effort|use|new|pick|workflow. \" +\n\t\t\"Aliases like fable-5-1, opus-5-5, sonnet-5, gpt-6-sol, gpt-6-luna, astra resolve against your configured models.\",\n\t\"flow-profile\": \"List, show, select, import or edit Flow profiles. Args: [list|show|use|export|import|validate ...]\",\n\tomsg:\n\t\t\"Send a message to the running orchestration (queued, delivered to the next dispatched task). \" +\n\t\t\"Usage: /omsg <text> — the lead will see and respond to it. Use '\\\\n' for newlines if needed.\",\n};\n\n/**\n * Act on an already loaded run only; with Flow not loaded there is no run, so Flow is never imported for them. They\n * stay reachable when Flow is disabled so a live run can still be stopped. Every other stub is refused when disabled.\n */\nconst LOADED_RUN_COMMANDS = new Set([\"flow-cancel\", \"flow-status\", \"flow-pause\", \"flow-resume\"]);\n/** Kill switch: resume would restart dispatch, so it is refused while Flow is disabled (cancel, status and pause are not). */\nconst AVAILABLE_WHEN_DISABLED = new Set([\"flow-cancel\", \"flow-status\", \"flow-pause\"]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction disabledReason(pi: ExtensionAPI, env: NodeJS.ProcessEnv): string | undefined {\n\tconst raw = env[HUMAIN_FLOW_DISABLED_ENV]?.trim().toLowerCase();\n\tif (raw === \"1\" || raw === \"true\") return `${HUMAIN_FLOW_DISABLED_ENV}=${raw}`;\n\ttry {\n\t\t// `flow` is not a typed Settings key: settings.json keeps unknown keys, so read it raw.\n\t\tconst flow = (pi.getSettings() as Record<string, unknown>).flow;\n\t\tif (isRecord(flow) && flow.enabled === false) return \"setting flow.enabled=false\";\n\t} catch {\n\t\t// Runtime not bound yet: treat as enabled.\n\t}\n\treturn undefined;\n}\n\n/**\n * Run flowExtension against a staging proxy. Stub commands are captured (so names never double-register); every other\n * registration is recorded and applied to the real pi only after the factory and the session_start replay succeed, so\n * a failed attempt leaves nothing behind and a retry starts from scratch. Late registration is supported by the\n * extension loader (handlers, tools, commands and flags are written to the live extension object), but\n * `session_start` has already fired by the time Flow loads, so the last session_start event is replayed to Flow's\n * staged session_start handlers.\n *\n * Commit is not transactional for non-handler members: if one throws midway, committed handlers are unsubscribed, and\n * tools/commands/flags/shortcuts/renderers (keyed maps in the extension loader) are simply overwritten on retry.\n */\nasync function runFlowExtension(\n\tpi: ExtensionAPI,\n\tflowExtension: ExtensionFactory,\n\tlastSessionStart: () => unknown[] | undefined,\n): Promise<Map<string, CommandOptions>> {\n\tconst captured = new Map<string, CommandOptions>();\n\tconst staged: StagedCall[] = [];\n\t// After a successful commit the proxy forwards live, so registrations made later (from handlers) reach the real pi.\n\tlet live = false;\n\tconst proxy = new Proxy(pi, {\n\t\tget(target, prop) {\n\t\t\tif (!live && typeof prop === \"string\" && STAGED_MEMBERS.has(prop)) {\n\t\t\t\treturn (...args: unknown[]) => {\n\t\t\t\t\tif (prop === \"registerCommand\" && typeof args[0] === \"string\" && args[0] in STUB_COMMANDS) {\n\t\t\t\t\t\tcaptured.set(args[0], args[1] as CommandOptions);\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\tconst call: StagedCall = { member: prop, args, cancelled: false };\n\t\t\t\t\tstaged.push(call);\n\t\t\t\t\tif (prop !== \"on\") return undefined;\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tcall.cancelled = true;\n\t\t\t\t\t\tcall.unsubscribe?.();\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst value: unknown = Reflect.get(target, prop, target);\n\t\t\treturn typeof value === \"function\" ? value.bind(target) : value;\n\t\t},\n\t});\n\tawait flowExtension(proxy);\n\n\tlet replayed: unknown[] | undefined;\n\tfor (let start = lastSessionStart(); start && start !== replayed; start = lastSessionStart()) {\n\t\treplayed = start;\n\t\tfor (const call of staged) {\n\t\t\tif (call.member === \"on\" && call.args[0] === \"session_start\" && !call.cancelled) {\n\t\t\t\tawait (call.args[1] as EventHandler)(...start);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Synchronous from the last replay check: no session_start can slip between replay and commit.\n\tconst committed: Array<() => void> = [];\n\ttry {\n\t\tfor (const call of staged) {\n\t\t\tif (call.cancelled) continue;\n\t\t\tconst result = (Reflect.get(pi, call.member) as (...args: unknown[]) => unknown).apply(pi, call.args);\n\t\t\tif (call.member === \"on\") {\n\t\t\t\tcall.unsubscribe = result as () => void;\n\t\t\t\tcommitted.push(call.unsubscribe);\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tfor (const unsubscribe of committed) unsubscribe();\n\t\tthrow error;\n\t}\n\tlive = true;\n\treturn captured;\n}\n\nexport function createHumainFlowLoaderExtensionFactory(options: HumainFlowLoaderOptions = {}): ExtensionFactory {\n\tconst env = options.env ?? process.env;\n\t// This is the single sanctioned lazy-load boundary for @humain/flow (see AGENTS.md \"No inline imports\" exception).\n\tconst importFlow = options.importFlow ?? (() => import(\"@humain/flow\"));\n\tconst flowPackageDir = options.flowPackageDir ?? getBundledFlowPackageDir();\n\tconst builtInProfilesDir = options.builtInProfilesDir ?? getBundledFlowProfilesDir();\n\tlet flowModule: Promise<FlowModule> | undefined;\n\n\treturn (pi) => {\n\t\tdisabledProbe = () => disabledReason(pi, env) !== undefined;\n\t\tlet lastStart: unknown[] | undefined;\n\t\tlet loaded: Promise<Map<string, CommandOptions>> | undefined;\n\n\t\tpi.on(\"session_start\", (event, ctx) => {\n\t\t\tlastStart = [event, ctx];\n\t\t});\n\t\tpi.registerFlag(\"profile\", { description: \"Flow profile id\", type: \"string\" });\n\t\tpi.registerFlag(\"flow-admission\", { description: \"Flow run admission file (JSON)\", type: \"string\" });\n\n\t\tconst loadModule = async (): Promise<FlowModule> => {\n\t\t\tif (flowPackageDir && !env[HUMAIN_FLOW_PACKAGE_DIR_ENV]) env[HUMAIN_FLOW_PACKAGE_DIR_ENV] = flowPackageDir;\n\t\t\tflowModule ??= importFlow().then((module) => {\n\t\t\t\trpcControl = module.createFlowRpcControl?.({\n\t\t\t\t\twriteFrame: (frame) => rpcOutput?.(frame),\n\t\t\t\t\tisDisabled: isFlowDisabled,\n\t\t\t\t\tsendFollowUp: (text) =>\n\t\t\t\t\t\trpcFollowUp ? rpcFollowUp(text) : Promise.reject(new Error(\"host unavailable\")),\n\t\t\t\t});\n\t\t\t\treturn module;\n\t\t\t});\n\t\t\ttry {\n\t\t\t\treturn await flowModule;\n\t\t\t} catch (error) {\n\t\t\t\tflowModule = undefined;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t};\n\n\t\trpcLoader = async () => {\n\t\t\ttry {\n\t\t\t\tawait loadModule();\n\t\t\t} catch {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn rpcControl;\n\t\t};\n\n\t\tconst load = (): Promise<Map<string, CommandOptions>> => {\n\t\t\tif (!loaded) {\n\t\t\t\tconst attempt = (async () => {\n\t\t\t\t\tconst module = await loadModule();\n\t\t\t\t\treturn runFlowExtension(pi, module.flowExtension, () => lastStart);\n\t\t\t\t})();\n\t\t\t\tloaded = attempt;\n\t\t\t\t// A failed load must be retryable on the next invocation.\n\t\t\t\tattempt.catch(() => {\n\t\t\t\t\tif (loaded === attempt) loaded = undefined;\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn loaded;\n\t\t};\n\n\t\tfor (const [name, description] of Object.entries(STUB_COMMANDS)) {\n\t\t\tpi.registerCommand(name, {\n\t\t\t\tdescription,\n\t\t\t\thandler: async (args: string, ctx: ExtensionCommandContext) => {\n\t\t\t\t\tconst reason = AVAILABLE_WHEN_DISABLED.has(name) ? undefined : disabledReason(pi, env);\n\t\t\t\t\tif (reason) {\n\t\t\t\t\t\tctx.ui.notify(`Flow disabled (${reason}). /${name} is unavailable.`, \"warning\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (name === \"flow-profile\") {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst module = await loadModule();\n\t\t\t\t\t\t\tif (!module.runFlowProfileCommand || !module.createProfileStore) {\n\t\t\t\t\t\t\t\tctx.ui.notify(\"/flow-profile is not available in this Flow build\", \"error\");\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst store = module.createProfileStore({\n\t\t\t\t\t\t\t\tflowDir: options.flowDir ?? join(getAgentDir(), \"flow\"),\n\t\t\t\t\t\t\t\t...(builtInProfilesDir !== undefined ? { builtInDir: builtInProfilesDir } : {}),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tawait module.runFlowProfileCommand(args, ctx, { store });\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t\t`/flow-profile failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (LOADED_RUN_COMMANDS.has(name) && !loaded) {\n\t\t\t\t\t\tctx.ui.notify(\"no active run\", \"info\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet commands: Map<string, CommandOptions>;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tcommands = await load();\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t`Failed to load Flow: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst real = commands.get(name);\n\t\t\t\t\tif (!real) {\n\t\t\t\t\t\tctx.ui.notify(`/${name} is not available yet`, \"error\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tawait real.handler(args, ctx);\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/humain/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/humain/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAajE,eAAO,MAAM,qBAAqB,iBAAiB,CAAC;AACpD,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAClD,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAChD,eAAO,MAAM,oBAAoB,8BAA8B,CAAC;AAqHhE,wBAAsB,0BAA0B,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAIvG;AAiQD,wBAAgB,8BAA8B,IAAI,aAAa,EAAE,CAEhE;AAED,wBAAgB,oCAAoC,CACnD,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,aAAa,GAAE,MAAkB,GAC/B,gBAAgB,CAWlB;AAED,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,gBAAgB,EAAE,CAa7F"}
|
package/dist/humain/index.js
CHANGED
|
@@ -4,6 +4,7 @@ import { createHumainAdhdExtensionFactory } from "./adhd/index.js";
|
|
|
4
4
|
import { bedrockProviderModule } from "./bedrock-provider/vendor/index.bundle.mjs";
|
|
5
5
|
import { createHumainBtwExtensionFactory } from "./btw/index.js";
|
|
6
6
|
import { createHumainCavemanExtensionFactory } from "./caveman/index.js";
|
|
7
|
+
import { createHumainFlowLoaderExtensionFactory } from "./flow-loader.js";
|
|
7
8
|
import { cleanupLegacyWorkflowTiers, getLegacyWorkflowTierPaths } from "./legacy-workflow-tiers.js";
|
|
8
9
|
import { createHumainModeOwnershipExtensionFactory } from "./mode-ownership.js";
|
|
9
10
|
import { createHumainNodeProvider } from "./node-provider.js";
|
|
@@ -371,6 +372,7 @@ export function getHumainBundledExtensionFactories(env) {
|
|
|
371
372
|
createHumainAdhdExtensionFactory(),
|
|
372
373
|
createHumainBtwExtensionFactory(),
|
|
373
374
|
createHumainModeOwnershipExtensionFactory(),
|
|
375
|
+
createHumainFlowLoaderExtensionFactory({ env }),
|
|
374
376
|
createHumainTraceCaptureExtensionFactory(env),
|
|
375
377
|
];
|
|
376
378
|
}
|
package/dist/humain/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/humain/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from \"node:os\";\nimport type { Api, OAuthCredentials } from \"@earendil-works/pi-ai\";\nimport { setBedrockProviderModule } from \"@earendil-works/pi-ai/compat\";\nimport type { ExtensionAPI, ExtensionFactory, ProviderModelConfig } from \"../core/extensions/types.ts\";\nimport type { PackageSource } from \"../core/settings-manager.ts\";\nimport { createHumainAdhdExtensionFactory } from \"./adhd/index.ts\";\nimport { bedrockProviderModule } from \"./bedrock-provider/vendor/index.bundle.mjs\";\nimport { createHumainBtwExtensionFactory } from \"./btw/index.ts\";\nimport { createHumainCavemanExtensionFactory } from \"./caveman/index.ts\";\nimport { cleanupLegacyWorkflowTiers, getLegacyWorkflowTierPaths } from \"./legacy-workflow-tiers.ts\";\nimport { createHumainModeOwnershipExtensionFactory } from \"./mode-ownership.ts\";\nimport { createHumainNodeProvider } from \"./node-provider.ts\";\nimport { createHumainPonytailExtensionFactory } from \"./ponytail/index.ts\";\nimport { createHumainTraceCaptureExtensionFactory } from \"./trace-capture/index.ts\";\nimport { createHumainWebAccessExtensionFactory } from \"./web-access/index.ts\";\n\nexport const HUMAIN_LOCAL_PROVIDER = \"humain-local\";\nexport const HUMAIN_CODE_PROVIDER = \"humain-code\";\nexport const HUMAIN_SSO_PROVIDER = \"humain-sso\";\nexport const HUMAIN_FORGE_CWD_ENV = \"HUMAIN_TERMINAL_FORGE_CWD\";\n\nsetBedrockProviderModule(bedrockProviderModule);\n\nconst LOCAL_MODELS_ENV = \"HUMAIN_TERMINAL_LOCAL_MODELS\";\nconst LOCAL_BASE_URL_ENV = \"HUMAIN_TERMINAL_LOCAL_BASE_URL\";\nconst LEGACY_LOCAL_BASE_URL_ENV = \"HUMAIN_TERMINAL_AI_BASE_URL\";\nconst LOCAL_API_KEY_ENV = \"HUMAIN_TERMINAL_LOCAL_API_KEY\";\nconst LEGACY_LOCAL_API_KEY_ENV = \"HUMAIN_TERMINAL_AI_API_KEY\";\nconst LOCAL_DISCOVERY_TIMEOUT_ENV = \"HUMAIN_TERMINAL_LOCAL_MODELS_DISCOVERY_TIMEOUT_MS\";\nconst HC_BASE_URL_ENV = \"HUMAIN_TERMINAL_HC_BASE_URL\";\nconst HC_API_KEY_ENV = \"HUMAIN_TERMINAL_HC_API_KEY\";\nconst HC_MODELS_ENV = \"HUMAIN_TERMINAL_HC_MODELS\";\nconst HUMAIN_CODE_BASE_URL_ENV = \"HUMAIN_TERMINAL_HUMAIN_CODE_BASE_URL\";\nconst HUMAIN_CODE_API_KEY_ENV = \"HUMAIN_TERMINAL_HUMAIN_CODE_API_KEY\";\nconst HUMAIN_CODE_MODELS_ENV = \"HUMAIN_TERMINAL_HUMAIN_CODE_MODELS\";\nconst DEPLOYNOW_PROXY_SENTINEL = \"deploynow-proxy\";\nconst DEPLOYNOW_BROKER_SENTINEL = \"deploynow-broker\";\nconst DEPLOYNOW_ANTHROPIC_LEGACY_SENTINEL = \"not-a-real-key-routed-via-proxy\";\nconst DEPLOYNOW_PROXY_SENTINELS = new Set([\n\tDEPLOYNOW_PROXY_SENTINEL,\n\tDEPLOYNOW_BROKER_SENTINEL,\n\tDEPLOYNOW_ANTHROPIC_LEGACY_SENTINEL,\n]);\nconst DEPLOYNOW_BEDROCK_BASE_URL_ENV = \"ANTHROPIC_BEDROCK_BASE_URL\";\nconst DEPLOYNOW_ANTHROPIC_BASE_URL_ENV = \"ANTHROPIC_BASE_URL\";\nconst DEPLOYNOW_OPENAI_BASE_URL_ENV = \"OPENAI_BASE_URL\";\nconst AWS_REGION_ENV = \"AWS_REGION\";\nconst AWS_ACCESS_KEY_ID_ENV = \"AWS_ACCESS_KEY_ID\";\nconst AWS_SECRET_ACCESS_KEY_ENV = \"AWS_SECRET_ACCESS_KEY\";\nconst AWS_SESSION_TOKEN_ENV = \"AWS_SESSION_TOKEN\";\nconst ANTHROPIC_API_KEY_ENV = \"ANTHROPIC_API_KEY\";\nconst OPENAI_API_KEY_ENV = \"OPENAI_API_KEY\";\nconst BEDROCK_MODEL_ID_ENV = \"BEDROCK_MODEL_ID\";\nconst OPENAI_MODEL_ID_ENV = \"OPENAI_MODEL_ID\";\nconst ANTHROPIC_MODEL_ID_ENV = \"ANTHROPIC_MODEL_ID\";\nconst FORGE_RUNTIME_MODEL_PROVIDER_ENV = \"FORGE_RUNTIME_MODEL_PROVIDER\";\nconst FORGE_RUNTIME_MODEL_ID_ENV = \"FORGE_RUNTIME_MODEL_ID\";\nconst DEFAULT_LOCAL_CONTEXT_WINDOW = 128000;\nconst DEFAULT_LOCAL_MAX_TOKENS = 16384;\nconst DEFAULT_LOCAL_MODEL_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\nconst AMAZON_BEDROCK_PROVIDER = \"amazon-bedrock\";\nconst ANTHROPIC_PROVIDER = \"anthropic\";\nconst OPENAI_PROVIDER = \"openai\";\nconst HUMAIN_SSO_UNSUPPORTED_MESSAGE = \"HUMAIN SSO is not supported yet.\";\n\ninterface DiscoveryModelList {\n\tdata?: Array<{ id?: unknown }>;\n}\n\nconst DEFAULT_HUMAIN_CODE_MODELS = [\"humain-planning\", \"humain-code\", \"humain-review\", \"humain-long-context\"];\n\nfunction readCsvEnv(env: NodeJS.ProcessEnv, key: string): string[] {\n\tconst raw = env[key];\n\tif (!raw) return [];\n\treturn raw\n\t\t.split(\",\")\n\t\t.map((item) => item.trim())\n\t\t.filter((item) => item.length > 0);\n}\n\nfunction readNonEmptyEnv(env: NodeJS.ProcessEnv, key: string): string | undefined {\n\tconst value = env[key]?.trim();\n\treturn value ? value : undefined;\n}\n\nfunction toModelConfig(id: string, api: Api = \"openai-completions\"): ProviderModelConfig {\n\tconst config: ProviderModelConfig = {\n\t\tid,\n\t\tname: id,\n\t\tapi,\n\t\treasoning: false,\n\t\tinput: [\"text\"],\n\t\tcost: DEFAULT_LOCAL_MODEL_COST,\n\t\tcontextWindow: DEFAULT_LOCAL_CONTEXT_WINDOW,\n\t\tmaxTokens: DEFAULT_LOCAL_MAX_TOKENS,\n\t};\n\n\tif (api === \"openai-completions\") {\n\t\tconfig.compat = {\n\t\t\tsupportsStore: false,\n\t\t\tsupportsDeveloperRole: false,\n\t\t\tsupportsReasoningEffort: false,\n\t\t\tsupportsUsageInStreaming: false,\n\t\t\tmaxTokensField: \"max_tokens\",\n\t\t\tsupportsStrictMode: false,\n\t\t\tsupportsLongCacheRetention: false,\n\t\t};\n\t}\n\n\treturn config;\n}\n\nasync function discoverLocalModelIds(env: NodeJS.ProcessEnv): Promise<string[]> {\n\tconst baseUrl = getLocalBaseUrl(env);\n\tif (!baseUrl) return [];\n\tconst timeoutMs = Number(env[LOCAL_DISCOVERY_TIMEOUT_ENV] ?? \"750\");\n\tconst controller = new AbortController();\n\tconst timeout = setTimeout(() => controller.abort(), Number.isFinite(timeoutMs) && timeoutMs > 0 ? timeoutMs : 750);\n\tconst apiKey = getLocalApiKey(env);\n\ttry {\n\t\tconst response = await fetch(new URL(\"models\", baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`), {\n\t\t\tsignal: controller.signal,\n\t\t\theaders: apiKey ? { Authorization: `Bearer ${apiKey}` } : undefined,\n\t\t});\n\t\tif (!response.ok) return [];\n\t\tconst payload = (await response.json()) as DiscoveryModelList;\n\t\treturn (payload.data ?? [])\n\t\t\t.map((model) => (typeof model.id === \"string\" ? model.id.trim() : \"\"))\n\t\t\t.filter((id) => id.length > 0);\n\t} catch {\n\t\treturn [];\n\t} finally {\n\t\tclearTimeout(timeout);\n\t}\n}\n\nexport async function getHumainLocalModelConfigs(env: NodeJS.ProcessEnv): Promise<ProviderModelConfig[]> {\n\tconst envModelIds = readCsvEnv(env, LOCAL_MODELS_ENV);\n\tconst modelIds = envModelIds.length > 0 ? envModelIds : await discoverLocalModelIds(env);\n\treturn [...new Set(modelIds)].map((id) => toModelConfig(id));\n}\n\nfunction getLocalBaseUrl(env: NodeJS.ProcessEnv): string | undefined {\n\treturn env[LOCAL_BASE_URL_ENV] ?? env[LEGACY_LOCAL_BASE_URL_ENV];\n}\n\nfunction getLocalApiKey(env: NodeJS.ProcessEnv): string | undefined {\n\treturn env[LOCAL_API_KEY_ENV] ?? env[LEGACY_LOCAL_API_KEY_ENV];\n}\n\nfunction getHumainCodeBaseUrl(env: NodeJS.ProcessEnv): string | undefined {\n\treturn env[HUMAIN_CODE_BASE_URL_ENV] ?? env[HC_BASE_URL_ENV];\n}\n\nfunction getHumainCodeApiKey(env: NodeJS.ProcessEnv): string | undefined {\n\treturn env[HUMAIN_CODE_API_KEY_ENV] ?? env[HC_API_KEY_ENV];\n}\n\nfunction isDeployNowProxyCredential(value: string | undefined): boolean {\n\treturn value !== undefined && DEPLOYNOW_PROXY_SENTINELS.has(value);\n}\n\nfunction getDeployNowCredential(env: NodeJS.ProcessEnv, key: string): string {\n\treturn readNonEmptyEnv(env, key) ?? DEPLOYNOW_PROXY_SENTINEL;\n}\n\nfunction getDeployNowBedrockRequestEnv(env: NodeJS.ProcessEnv): Record<string, string> {\n\tconst requestEnv: Record<string, string> = {\n\t\t[AWS_ACCESS_KEY_ID_ENV]: getDeployNowCredential(env, AWS_ACCESS_KEY_ID_ENV),\n\t\t[AWS_SECRET_ACCESS_KEY_ENV]: getDeployNowCredential(env, AWS_SECRET_ACCESS_KEY_ENV),\n\t\t[AWS_REGION_ENV]: readNonEmptyEnv(env, AWS_REGION_ENV) ?? \"\",\n\t};\n\tconst sessionToken = readNonEmptyEnv(env, AWS_SESSION_TOKEN_ENV);\n\tif (sessionToken) {\n\t\trequestEnv[AWS_SESSION_TOKEN_ENV] = sessionToken;\n\t}\n\treturn requestEnv;\n}\n\n/**\n * Build the Bedrock request env for direct AWS IAM-key auth. Mirrors the\n * keys the AWS SDK expects, scoped to the values actually present in the\n * process environment so partial configurations (e.g. no session token)\n * degrade cleanly. The bedrock provider reads these via `getProviderEnvValue`,\n * which checks `options.env` before falling back to `process.env`, so any\n * values set here win.\n */\nfunction getDirectAwsBedrockRequestEnv(env: NodeJS.ProcessEnv): Record<string, string> {\n\tconst requestEnv: Record<string, string> = {};\n\tconst region = readNonEmptyEnv(env, AWS_REGION_ENV);\n\tconst accessKeyId = readNonEmptyEnv(env, AWS_ACCESS_KEY_ID_ENV);\n\tconst secretAccessKey = readNonEmptyEnv(env, AWS_SECRET_ACCESS_KEY_ENV);\n\tconst sessionToken = readNonEmptyEnv(env, AWS_SESSION_TOKEN_ENV);\n\tif (region) requestEnv[AWS_REGION_ENV] = region;\n\tif (accessKeyId) requestEnv[AWS_ACCESS_KEY_ID_ENV] = accessKeyId;\n\tif (secretAccessKey) requestEnv[AWS_SECRET_ACCESS_KEY_ENV] = secretAccessKey;\n\tif (sessionToken) requestEnv[AWS_SESSION_TOKEN_ENV] = sessionToken;\n\treturn requestEnv;\n}\n\n// AWS access keys are 20 chars: AKIA (permanent) or ASIA (STS session token), followed by 16 alphanumeric chars.\nconst AWS_ACCESS_KEY_PATTERN = /^(AKIA|ASIA)[A-Z0-9]{16}$/;\n\nfunction isAwsAccessKeyId(value: string | undefined): boolean {\n\treturn typeof value === \"string\" && AWS_ACCESS_KEY_PATTERN.test(value.trim());\n}\n\n/**\n * Direct AWS credentials (real IAM keys or STS session tokens) sufficient to\n * sign Bedrock requests. Returns false when only DeployNow proxy sentinels\n * (`deploynow-broker` / `deploynow-proxy` / the legacy Anthropic-shaped\n * sentinel) are present — those are not real AWS credentials.\n */\nfunction hasDirectAwsCredentials(env: NodeJS.ProcessEnv): boolean {\n\tconst accessKeyId = readNonEmptyEnv(env, AWS_ACCESS_KEY_ID_ENV);\n\tconst secretAccessKey = readNonEmptyEnv(env, AWS_SECRET_ACCESS_KEY_ENV);\n\tconst region = readNonEmptyEnv(env, AWS_REGION_ENV);\n\tif (!region || !secretAccessKey) return false;\n\tif (!isAwsAccessKeyId(accessKeyId)) return false;\n\t// Defend against the DeployNow sentinel masquerading as a real key: the\n\t// sentinels are short, lower-case strings that fail the AWS key pattern,\n\t// but an extra guard keeps the contract obvious at the call site.\n\treturn !isDeployNowProxyCredential(accessKeyId);\n}\n\nfunction hasDeployNowBedrockBindingConfig(env: NodeJS.ProcessEnv): boolean {\n\treturn Boolean(\n\t\treadNonEmptyEnv(env, DEPLOYNOW_BEDROCK_BASE_URL_ENV) &&\n\t\t\treadNonEmptyEnv(env, AWS_REGION_ENV) &&\n\t\t\tisDeployNowProxyCredential(env[AWS_ACCESS_KEY_ID_ENV]) &&\n\t\t\tisDeployNowProxyCredential(env[AWS_SECRET_ACCESS_KEY_ENV]),\n\t);\n}\n\nfunction hasDeployNowAnthropicBindingConfig(env: NodeJS.ProcessEnv): boolean {\n\treturn Boolean(\n\t\treadNonEmptyEnv(env, DEPLOYNOW_ANTHROPIC_BASE_URL_ENV) && isDeployNowProxyCredential(env[ANTHROPIC_API_KEY_ENV]),\n\t);\n}\n\nfunction hasDeployNowOpenAiBindingConfig(env: NodeJS.ProcessEnv): boolean {\n\treturn Boolean(\n\t\treadNonEmptyEnv(env, DEPLOYNOW_OPENAI_BASE_URL_ENV) && isDeployNowProxyCredential(env[OPENAI_API_KEY_ENV]),\n\t);\n}\n\nfunction getDeployNowBedrockModelId(env: NodeJS.ProcessEnv): string | undefined {\n\treturn (\n\t\t(isForgeRuntimeBedrockProvider(env) ? readNonEmptyEnv(env, FORGE_RUNTIME_MODEL_ID_ENV) : undefined) ??\n\t\treadNonEmptyEnv(env, BEDROCK_MODEL_ID_ENV)\n\t);\n}\n\nfunction getDeployNowOpenAiModelId(env: NodeJS.ProcessEnv): string | undefined {\n\treturn (\n\t\t(getForgeRuntimeModelProvider(env) === \"openai\" ? readNonEmptyEnv(env, FORGE_RUNTIME_MODEL_ID_ENV) : undefined) ??\n\t\treadNonEmptyEnv(env, OPENAI_MODEL_ID_ENV)\n\t);\n}\n\nfunction getDeployNowAnthropicModelId(env: NodeJS.ProcessEnv): string | undefined {\n\treturn (\n\t\t(getForgeRuntimeModelProvider(env) === \"anthropic\"\n\t\t\t? readNonEmptyEnv(env, FORGE_RUNTIME_MODEL_ID_ENV)\n\t\t\t: undefined) ?? readNonEmptyEnv(env, ANTHROPIC_MODEL_ID_ENV)\n\t);\n}\n\nfunction getForgeRuntimeModelProvider(env: NodeJS.ProcessEnv): string | undefined {\n\treturn readNonEmptyEnv(env, FORGE_RUNTIME_MODEL_PROVIDER_ENV)?.toLowerCase();\n}\n\nfunction isForgeRuntimeBedrockProvider(env: NodeJS.ProcessEnv): boolean {\n\tconst runtimeProvider = getForgeRuntimeModelProvider(env);\n\treturn runtimeProvider === \"bedrock\" || runtimeProvider === AMAZON_BEDROCK_PROVIDER;\n}\n\nfunction createUnsupportedHumainSsoProvider() {\n\treturn {\n\t\tname: \"HUMAIN SSO\",\n\t\tasync login(): Promise<OAuthCredentials> {\n\t\t\tthrow new Error(HUMAIN_SSO_UNSUPPORTED_MESSAGE);\n\t\t},\n\t\tasync refreshToken(): Promise<OAuthCredentials> {\n\t\t\tthrow new Error(HUMAIN_SSO_UNSUPPORTED_MESSAGE);\n\t\t},\n\t\tgetApiKey(): string {\n\t\t\tthrow new Error(HUMAIN_SSO_UNSUPPORTED_MESSAGE);\n\t\t},\n\t};\n}\n\nfunction getHumainCodeModelIds(env: NodeJS.ProcessEnv): string[] {\n\tconst configuredModels = readCsvEnv(env, HUMAIN_CODE_MODELS_ENV);\n\tconst shorthandModels = configuredModels.length > 0 ? configuredModels : readCsvEnv(env, HC_MODELS_ENV);\n\treturn shorthandModels.length > 0 ? shorthandModels : DEFAULT_HUMAIN_CODE_MODELS;\n}\n\nfunction getHumainCodeModels(env: NodeJS.ProcessEnv): ProviderModelConfig[] {\n\treturn getHumainCodeModelIds(env).map((id) => toModelConfig(id));\n}\n\nfunction registerDeployNowBindingProviders(pi: ExtensionAPI, env: NodeJS.ProcessEnv): void {\n\tconst bedrockBaseUrl = readNonEmptyEnv(env, DEPLOYNOW_BEDROCK_BASE_URL_ENV);\n\tconst bedrockModel = getDeployNowBedrockModelId(env);\n\tconst isDeployNowBedrock = bedrockBaseUrl && hasDeployNowBedrockBindingConfig(env);\n\tconst isDirectAwsBedrock = !isDeployNowBedrock && hasDirectAwsCredentials(env);\n\tif (isDeployNowBedrock) {\n\t\t// Forge-managed DeployNow sandbox: uses the broker base URL and the\n\t\t// DeployNow dummy credentials. The bedrock provider exchanges the\n\t\t// dummy credentials for a bearer token against the broker.\n\t\tpi.registerProvider(AMAZON_BEDROCK_PROVIDER, {\n\t\t\tname: \"DeployNow Bedrock Binding\",\n\t\t\tbaseUrl: bedrockBaseUrl,\n\t\t\tapiKey: getDeployNowCredential(env, AWS_ACCESS_KEY_ID_ENV),\n\t\t\tenv: getDeployNowBedrockRequestEnv(env),\n\t\t\tapi: \"bedrock-converse-stream\",\n\t\t\t...(bedrockModel ? { models: [toModelConfig(bedrockModel, \"bedrock-converse-stream\")] } : {}),\n\t\t});\n\t} else if (isDirectAwsBedrock) {\n\t\t// Direct AWS IAM-key auth: Forge (or a manual launch) passed real\n\t\t// AWS credentials through the environment. Register the provider so\n\t\t// the built-in catalog is wired up with the same env; the bedrock\n\t\t// runtime picks up AWS_REGION/AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY\n\t\t// from `options.env` (which wins over `process.env` in the auth\n\t\t// resolve). An optional `ANTHROPIC_BEDROCK_BASE_URL` keeps the proxy\n\t\t// path available without re-introducing the DeployNow sentinel check.\n\t\tpi.registerProvider(AMAZON_BEDROCK_PROVIDER, {\n\t\t\tname: bedrockBaseUrl ? \"Bedrock (custom endpoint)\" : \"Bedrock\",\n\t\t\t...(bedrockBaseUrl ? { baseUrl: bedrockBaseUrl } : {}),\n\t\t\tenv: getDirectAwsBedrockRequestEnv(env),\n\t\t\tapi: \"bedrock-converse-stream\",\n\t\t\t...(bedrockModel ? { models: [toModelConfig(bedrockModel, \"bedrock-converse-stream\")] } : {}),\n\t\t});\n\t}\n\n\tconst anthropicBaseUrl = readNonEmptyEnv(env, DEPLOYNOW_ANTHROPIC_BASE_URL_ENV);\n\tconst anthropicModel = getDeployNowAnthropicModelId(env);\n\tif (anthropicBaseUrl && hasDeployNowAnthropicBindingConfig(env)) {\n\t\tpi.registerProvider(ANTHROPIC_PROVIDER, {\n\t\t\tname: \"DeployNow Anthropic Binding\",\n\t\t\tbaseUrl: anthropicBaseUrl,\n\t\t\tapiKey: getDeployNowCredential(env, ANTHROPIC_API_KEY_ENV),\n\t\t\tapi: \"anthropic-messages\",\n\t\t\t...(anthropicModel ? { models: [toModelConfig(anthropicModel, \"anthropic-messages\")] } : {}),\n\t\t});\n\t}\n\n\tconst openAiBaseUrl = readNonEmptyEnv(env, DEPLOYNOW_OPENAI_BASE_URL_ENV);\n\tconst openAiModel = getDeployNowOpenAiModelId(env);\n\tif (openAiBaseUrl && hasDeployNowOpenAiBindingConfig(env)) {\n\t\tpi.registerProvider(OPENAI_PROVIDER, {\n\t\t\tname: \"DeployNow OpenAI Binding\",\n\t\t\tbaseUrl: openAiBaseUrl,\n\t\t\tapiKey: getDeployNowCredential(env, OPENAI_API_KEY_ENV),\n\t\t\tapi: \"openai-completions\",\n\t\t\t...(openAiModel ? { models: [toModelConfig(openAiModel, \"openai-completions\")] } : {}),\n\t\t});\n\t}\n}\n\nasync function registerHumainProviders(pi: ExtensionAPI, env: NodeJS.ProcessEnv): Promise<void> {\n\tpi.registerProvider(createHumainNodeProvider(env));\n\tconst localBaseUrl = getLocalBaseUrl(env);\n\tconst localModels = await getHumainLocalModelConfigs(env);\n\tif (localBaseUrl && localModels.length > 0) {\n\t\tpi.registerProvider(HUMAIN_LOCAL_PROVIDER, {\n\t\t\tname: \"HUMAIN Local\",\n\t\t\tbaseUrl: localBaseUrl,\n\t\t\tapiKey: getLocalApiKey(env) ?? \"local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tauthHeader: Boolean(getLocalApiKey(env)),\n\t\t\tmodels: localModels,\n\t\t});\n\t}\n\n\tconst humainCodeBaseUrl = getHumainCodeBaseUrl(env);\n\tconst humainCodeApiKey = getHumainCodeApiKey(env);\n\tif (humainCodeBaseUrl && humainCodeApiKey) {\n\t\tpi.registerProvider(HUMAIN_CODE_PROVIDER, {\n\t\t\tname: \"HUMAIN Code\",\n\t\t\tbaseUrl: humainCodeBaseUrl,\n\t\t\tapiKey: humainCodeApiKey,\n\t\t\tapi: \"openai-completions\",\n\t\t\tauthHeader: true,\n\t\t\tmodels: getHumainCodeModels(env),\n\t\t});\n\t}\n\n\tregisterDeployNowBindingProviders(pi, env);\n\n\tpi.registerProvider(HUMAIN_SSO_PROVIDER, {\n\t\tname: \"HUMAIN SSO\",\n\t\toauth: createUnsupportedHumainSsoProvider(),\n\t});\n}\n\nexport function getHumainDefaultPackageSources(): PackageSource[] {\n\treturn [];\n}\n\nexport function createHumainProviderExtensionFactory(\n\tenv: NodeJS.ProcessEnv,\n\thomeDirectory: string = homedir(),\n): ExtensionFactory {\n\treturn async (pi) => {\n\t\tawait registerHumainProviders(pi, env);\n\n\t\tpi.on(\"session_start\", (event, ctx) => {\n\t\t\tif (event.reason === \"startup\") {\n\t\t\t\tctx.ui.setTheme(\"humain-dark\");\n\t\t\t\tcleanupLegacyWorkflowTiers(getLegacyWorkflowTierPaths(homeDirectory));\n\t\t\t}\n\t\t});\n\t};\n}\n\nexport function getHumainBundledExtensionFactories(env: NodeJS.ProcessEnv): ExtensionFactory[] {\n\t// Stable prompt order for caching; explicit ownership resolves conflicts, not injection order.\n\treturn [\n\t\tcreateHumainProviderExtensionFactory(env),\n\t\tcreateHumainWebAccessExtensionFactory(),\n\t\tcreateHumainPonytailExtensionFactory(),\n\t\tcreateHumainCavemanExtensionFactory(),\n\t\tcreateHumainAdhdExtensionFactory(),\n\t\tcreateHumainBtwExtensionFactory(),\n\t\tcreateHumainModeOwnershipExtensionFactory(),\n\t\tcreateHumainTraceCaptureExtensionFactory(env),\n\t];\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/humain/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from \"node:os\";\nimport type { Api, OAuthCredentials } from \"@earendil-works/pi-ai\";\nimport { setBedrockProviderModule } from \"@earendil-works/pi-ai/compat\";\nimport type { ExtensionAPI, ExtensionFactory, ProviderModelConfig } from \"../core/extensions/types.ts\";\nimport type { PackageSource } from \"../core/settings-manager.ts\";\nimport { createHumainAdhdExtensionFactory } from \"./adhd/index.ts\";\nimport { bedrockProviderModule } from \"./bedrock-provider/vendor/index.bundle.mjs\";\nimport { createHumainBtwExtensionFactory } from \"./btw/index.ts\";\nimport { createHumainCavemanExtensionFactory } from \"./caveman/index.ts\";\nimport { createHumainFlowLoaderExtensionFactory } from \"./flow-loader.ts\";\nimport { cleanupLegacyWorkflowTiers, getLegacyWorkflowTierPaths } from \"./legacy-workflow-tiers.ts\";\nimport { createHumainModeOwnershipExtensionFactory } from \"./mode-ownership.ts\";\nimport { createHumainNodeProvider } from \"./node-provider.ts\";\nimport { createHumainPonytailExtensionFactory } from \"./ponytail/index.ts\";\nimport { createHumainTraceCaptureExtensionFactory } from \"./trace-capture/index.ts\";\nimport { createHumainWebAccessExtensionFactory } from \"./web-access/index.ts\";\n\nexport const HUMAIN_LOCAL_PROVIDER = \"humain-local\";\nexport const HUMAIN_CODE_PROVIDER = \"humain-code\";\nexport const HUMAIN_SSO_PROVIDER = \"humain-sso\";\nexport const HUMAIN_FORGE_CWD_ENV = \"HUMAIN_TERMINAL_FORGE_CWD\";\n\nsetBedrockProviderModule(bedrockProviderModule);\n\nconst LOCAL_MODELS_ENV = \"HUMAIN_TERMINAL_LOCAL_MODELS\";\nconst LOCAL_BASE_URL_ENV = \"HUMAIN_TERMINAL_LOCAL_BASE_URL\";\nconst LEGACY_LOCAL_BASE_URL_ENV = \"HUMAIN_TERMINAL_AI_BASE_URL\";\nconst LOCAL_API_KEY_ENV = \"HUMAIN_TERMINAL_LOCAL_API_KEY\";\nconst LEGACY_LOCAL_API_KEY_ENV = \"HUMAIN_TERMINAL_AI_API_KEY\";\nconst LOCAL_DISCOVERY_TIMEOUT_ENV = \"HUMAIN_TERMINAL_LOCAL_MODELS_DISCOVERY_TIMEOUT_MS\";\nconst HC_BASE_URL_ENV = \"HUMAIN_TERMINAL_HC_BASE_URL\";\nconst HC_API_KEY_ENV = \"HUMAIN_TERMINAL_HC_API_KEY\";\nconst HC_MODELS_ENV = \"HUMAIN_TERMINAL_HC_MODELS\";\nconst HUMAIN_CODE_BASE_URL_ENV = \"HUMAIN_TERMINAL_HUMAIN_CODE_BASE_URL\";\nconst HUMAIN_CODE_API_KEY_ENV = \"HUMAIN_TERMINAL_HUMAIN_CODE_API_KEY\";\nconst HUMAIN_CODE_MODELS_ENV = \"HUMAIN_TERMINAL_HUMAIN_CODE_MODELS\";\nconst DEPLOYNOW_PROXY_SENTINEL = \"deploynow-proxy\";\nconst DEPLOYNOW_BROKER_SENTINEL = \"deploynow-broker\";\nconst DEPLOYNOW_ANTHROPIC_LEGACY_SENTINEL = \"not-a-real-key-routed-via-proxy\";\nconst DEPLOYNOW_PROXY_SENTINELS = new Set([\n\tDEPLOYNOW_PROXY_SENTINEL,\n\tDEPLOYNOW_BROKER_SENTINEL,\n\tDEPLOYNOW_ANTHROPIC_LEGACY_SENTINEL,\n]);\nconst DEPLOYNOW_BEDROCK_BASE_URL_ENV = \"ANTHROPIC_BEDROCK_BASE_URL\";\nconst DEPLOYNOW_ANTHROPIC_BASE_URL_ENV = \"ANTHROPIC_BASE_URL\";\nconst DEPLOYNOW_OPENAI_BASE_URL_ENV = \"OPENAI_BASE_URL\";\nconst AWS_REGION_ENV = \"AWS_REGION\";\nconst AWS_ACCESS_KEY_ID_ENV = \"AWS_ACCESS_KEY_ID\";\nconst AWS_SECRET_ACCESS_KEY_ENV = \"AWS_SECRET_ACCESS_KEY\";\nconst AWS_SESSION_TOKEN_ENV = \"AWS_SESSION_TOKEN\";\nconst ANTHROPIC_API_KEY_ENV = \"ANTHROPIC_API_KEY\";\nconst OPENAI_API_KEY_ENV = \"OPENAI_API_KEY\";\nconst BEDROCK_MODEL_ID_ENV = \"BEDROCK_MODEL_ID\";\nconst OPENAI_MODEL_ID_ENV = \"OPENAI_MODEL_ID\";\nconst ANTHROPIC_MODEL_ID_ENV = \"ANTHROPIC_MODEL_ID\";\nconst FORGE_RUNTIME_MODEL_PROVIDER_ENV = \"FORGE_RUNTIME_MODEL_PROVIDER\";\nconst FORGE_RUNTIME_MODEL_ID_ENV = \"FORGE_RUNTIME_MODEL_ID\";\nconst DEFAULT_LOCAL_CONTEXT_WINDOW = 128000;\nconst DEFAULT_LOCAL_MAX_TOKENS = 16384;\nconst DEFAULT_LOCAL_MODEL_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\nconst AMAZON_BEDROCK_PROVIDER = \"amazon-bedrock\";\nconst ANTHROPIC_PROVIDER = \"anthropic\";\nconst OPENAI_PROVIDER = \"openai\";\nconst HUMAIN_SSO_UNSUPPORTED_MESSAGE = \"HUMAIN SSO is not supported yet.\";\n\ninterface DiscoveryModelList {\n\tdata?: Array<{ id?: unknown }>;\n}\n\nconst DEFAULT_HUMAIN_CODE_MODELS = [\"humain-planning\", \"humain-code\", \"humain-review\", \"humain-long-context\"];\n\nfunction readCsvEnv(env: NodeJS.ProcessEnv, key: string): string[] {\n\tconst raw = env[key];\n\tif (!raw) return [];\n\treturn raw\n\t\t.split(\",\")\n\t\t.map((item) => item.trim())\n\t\t.filter((item) => item.length > 0);\n}\n\nfunction readNonEmptyEnv(env: NodeJS.ProcessEnv, key: string): string | undefined {\n\tconst value = env[key]?.trim();\n\treturn value ? value : undefined;\n}\n\nfunction toModelConfig(id: string, api: Api = \"openai-completions\"): ProviderModelConfig {\n\tconst config: ProviderModelConfig = {\n\t\tid,\n\t\tname: id,\n\t\tapi,\n\t\treasoning: false,\n\t\tinput: [\"text\"],\n\t\tcost: DEFAULT_LOCAL_MODEL_COST,\n\t\tcontextWindow: DEFAULT_LOCAL_CONTEXT_WINDOW,\n\t\tmaxTokens: DEFAULT_LOCAL_MAX_TOKENS,\n\t};\n\n\tif (api === \"openai-completions\") {\n\t\tconfig.compat = {\n\t\t\tsupportsStore: false,\n\t\t\tsupportsDeveloperRole: false,\n\t\t\tsupportsReasoningEffort: false,\n\t\t\tsupportsUsageInStreaming: false,\n\t\t\tmaxTokensField: \"max_tokens\",\n\t\t\tsupportsStrictMode: false,\n\t\t\tsupportsLongCacheRetention: false,\n\t\t};\n\t}\n\n\treturn config;\n}\n\nasync function discoverLocalModelIds(env: NodeJS.ProcessEnv): Promise<string[]> {\n\tconst baseUrl = getLocalBaseUrl(env);\n\tif (!baseUrl) return [];\n\tconst timeoutMs = Number(env[LOCAL_DISCOVERY_TIMEOUT_ENV] ?? \"750\");\n\tconst controller = new AbortController();\n\tconst timeout = setTimeout(() => controller.abort(), Number.isFinite(timeoutMs) && timeoutMs > 0 ? timeoutMs : 750);\n\tconst apiKey = getLocalApiKey(env);\n\ttry {\n\t\tconst response = await fetch(new URL(\"models\", baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`), {\n\t\t\tsignal: controller.signal,\n\t\t\theaders: apiKey ? { Authorization: `Bearer ${apiKey}` } : undefined,\n\t\t});\n\t\tif (!response.ok) return [];\n\t\tconst payload = (await response.json()) as DiscoveryModelList;\n\t\treturn (payload.data ?? [])\n\t\t\t.map((model) => (typeof model.id === \"string\" ? model.id.trim() : \"\"))\n\t\t\t.filter((id) => id.length > 0);\n\t} catch {\n\t\treturn [];\n\t} finally {\n\t\tclearTimeout(timeout);\n\t}\n}\n\nexport async function getHumainLocalModelConfigs(env: NodeJS.ProcessEnv): Promise<ProviderModelConfig[]> {\n\tconst envModelIds = readCsvEnv(env, LOCAL_MODELS_ENV);\n\tconst modelIds = envModelIds.length > 0 ? envModelIds : await discoverLocalModelIds(env);\n\treturn [...new Set(modelIds)].map((id) => toModelConfig(id));\n}\n\nfunction getLocalBaseUrl(env: NodeJS.ProcessEnv): string | undefined {\n\treturn env[LOCAL_BASE_URL_ENV] ?? env[LEGACY_LOCAL_BASE_URL_ENV];\n}\n\nfunction getLocalApiKey(env: NodeJS.ProcessEnv): string | undefined {\n\treturn env[LOCAL_API_KEY_ENV] ?? env[LEGACY_LOCAL_API_KEY_ENV];\n}\n\nfunction getHumainCodeBaseUrl(env: NodeJS.ProcessEnv): string | undefined {\n\treturn env[HUMAIN_CODE_BASE_URL_ENV] ?? env[HC_BASE_URL_ENV];\n}\n\nfunction getHumainCodeApiKey(env: NodeJS.ProcessEnv): string | undefined {\n\treturn env[HUMAIN_CODE_API_KEY_ENV] ?? env[HC_API_KEY_ENV];\n}\n\nfunction isDeployNowProxyCredential(value: string | undefined): boolean {\n\treturn value !== undefined && DEPLOYNOW_PROXY_SENTINELS.has(value);\n}\n\nfunction getDeployNowCredential(env: NodeJS.ProcessEnv, key: string): string {\n\treturn readNonEmptyEnv(env, key) ?? DEPLOYNOW_PROXY_SENTINEL;\n}\n\nfunction getDeployNowBedrockRequestEnv(env: NodeJS.ProcessEnv): Record<string, string> {\n\tconst requestEnv: Record<string, string> = {\n\t\t[AWS_ACCESS_KEY_ID_ENV]: getDeployNowCredential(env, AWS_ACCESS_KEY_ID_ENV),\n\t\t[AWS_SECRET_ACCESS_KEY_ENV]: getDeployNowCredential(env, AWS_SECRET_ACCESS_KEY_ENV),\n\t\t[AWS_REGION_ENV]: readNonEmptyEnv(env, AWS_REGION_ENV) ?? \"\",\n\t};\n\tconst sessionToken = readNonEmptyEnv(env, AWS_SESSION_TOKEN_ENV);\n\tif (sessionToken) {\n\t\trequestEnv[AWS_SESSION_TOKEN_ENV] = sessionToken;\n\t}\n\treturn requestEnv;\n}\n\n/**\n * Build the Bedrock request env for direct AWS IAM-key auth. Mirrors the\n * keys the AWS SDK expects, scoped to the values actually present in the\n * process environment so partial configurations (e.g. no session token)\n * degrade cleanly. The bedrock provider reads these via `getProviderEnvValue`,\n * which checks `options.env` before falling back to `process.env`, so any\n * values set here win.\n */\nfunction getDirectAwsBedrockRequestEnv(env: NodeJS.ProcessEnv): Record<string, string> {\n\tconst requestEnv: Record<string, string> = {};\n\tconst region = readNonEmptyEnv(env, AWS_REGION_ENV);\n\tconst accessKeyId = readNonEmptyEnv(env, AWS_ACCESS_KEY_ID_ENV);\n\tconst secretAccessKey = readNonEmptyEnv(env, AWS_SECRET_ACCESS_KEY_ENV);\n\tconst sessionToken = readNonEmptyEnv(env, AWS_SESSION_TOKEN_ENV);\n\tif (region) requestEnv[AWS_REGION_ENV] = region;\n\tif (accessKeyId) requestEnv[AWS_ACCESS_KEY_ID_ENV] = accessKeyId;\n\tif (secretAccessKey) requestEnv[AWS_SECRET_ACCESS_KEY_ENV] = secretAccessKey;\n\tif (sessionToken) requestEnv[AWS_SESSION_TOKEN_ENV] = sessionToken;\n\treturn requestEnv;\n}\n\n// AWS access keys are 20 chars: AKIA (permanent) or ASIA (STS session token), followed by 16 alphanumeric chars.\nconst AWS_ACCESS_KEY_PATTERN = /^(AKIA|ASIA)[A-Z0-9]{16}$/;\n\nfunction isAwsAccessKeyId(value: string | undefined): boolean {\n\treturn typeof value === \"string\" && AWS_ACCESS_KEY_PATTERN.test(value.trim());\n}\n\n/**\n * Direct AWS credentials (real IAM keys or STS session tokens) sufficient to\n * sign Bedrock requests. Returns false when only DeployNow proxy sentinels\n * (`deploynow-broker` / `deploynow-proxy` / the legacy Anthropic-shaped\n * sentinel) are present — those are not real AWS credentials.\n */\nfunction hasDirectAwsCredentials(env: NodeJS.ProcessEnv): boolean {\n\tconst accessKeyId = readNonEmptyEnv(env, AWS_ACCESS_KEY_ID_ENV);\n\tconst secretAccessKey = readNonEmptyEnv(env, AWS_SECRET_ACCESS_KEY_ENV);\n\tconst region = readNonEmptyEnv(env, AWS_REGION_ENV);\n\tif (!region || !secretAccessKey) return false;\n\tif (!isAwsAccessKeyId(accessKeyId)) return false;\n\t// Defend against the DeployNow sentinel masquerading as a real key: the\n\t// sentinels are short, lower-case strings that fail the AWS key pattern,\n\t// but an extra guard keeps the contract obvious at the call site.\n\treturn !isDeployNowProxyCredential(accessKeyId);\n}\n\nfunction hasDeployNowBedrockBindingConfig(env: NodeJS.ProcessEnv): boolean {\n\treturn Boolean(\n\t\treadNonEmptyEnv(env, DEPLOYNOW_BEDROCK_BASE_URL_ENV) &&\n\t\t\treadNonEmptyEnv(env, AWS_REGION_ENV) &&\n\t\t\tisDeployNowProxyCredential(env[AWS_ACCESS_KEY_ID_ENV]) &&\n\t\t\tisDeployNowProxyCredential(env[AWS_SECRET_ACCESS_KEY_ENV]),\n\t);\n}\n\nfunction hasDeployNowAnthropicBindingConfig(env: NodeJS.ProcessEnv): boolean {\n\treturn Boolean(\n\t\treadNonEmptyEnv(env, DEPLOYNOW_ANTHROPIC_BASE_URL_ENV) && isDeployNowProxyCredential(env[ANTHROPIC_API_KEY_ENV]),\n\t);\n}\n\nfunction hasDeployNowOpenAiBindingConfig(env: NodeJS.ProcessEnv): boolean {\n\treturn Boolean(\n\t\treadNonEmptyEnv(env, DEPLOYNOW_OPENAI_BASE_URL_ENV) && isDeployNowProxyCredential(env[OPENAI_API_KEY_ENV]),\n\t);\n}\n\nfunction getDeployNowBedrockModelId(env: NodeJS.ProcessEnv): string | undefined {\n\treturn (\n\t\t(isForgeRuntimeBedrockProvider(env) ? readNonEmptyEnv(env, FORGE_RUNTIME_MODEL_ID_ENV) : undefined) ??\n\t\treadNonEmptyEnv(env, BEDROCK_MODEL_ID_ENV)\n\t);\n}\n\nfunction getDeployNowOpenAiModelId(env: NodeJS.ProcessEnv): string | undefined {\n\treturn (\n\t\t(getForgeRuntimeModelProvider(env) === \"openai\" ? readNonEmptyEnv(env, FORGE_RUNTIME_MODEL_ID_ENV) : undefined) ??\n\t\treadNonEmptyEnv(env, OPENAI_MODEL_ID_ENV)\n\t);\n}\n\nfunction getDeployNowAnthropicModelId(env: NodeJS.ProcessEnv): string | undefined {\n\treturn (\n\t\t(getForgeRuntimeModelProvider(env) === \"anthropic\"\n\t\t\t? readNonEmptyEnv(env, FORGE_RUNTIME_MODEL_ID_ENV)\n\t\t\t: undefined) ?? readNonEmptyEnv(env, ANTHROPIC_MODEL_ID_ENV)\n\t);\n}\n\nfunction getForgeRuntimeModelProvider(env: NodeJS.ProcessEnv): string | undefined {\n\treturn readNonEmptyEnv(env, FORGE_RUNTIME_MODEL_PROVIDER_ENV)?.toLowerCase();\n}\n\nfunction isForgeRuntimeBedrockProvider(env: NodeJS.ProcessEnv): boolean {\n\tconst runtimeProvider = getForgeRuntimeModelProvider(env);\n\treturn runtimeProvider === \"bedrock\" || runtimeProvider === AMAZON_BEDROCK_PROVIDER;\n}\n\nfunction createUnsupportedHumainSsoProvider() {\n\treturn {\n\t\tname: \"HUMAIN SSO\",\n\t\tasync login(): Promise<OAuthCredentials> {\n\t\t\tthrow new Error(HUMAIN_SSO_UNSUPPORTED_MESSAGE);\n\t\t},\n\t\tasync refreshToken(): Promise<OAuthCredentials> {\n\t\t\tthrow new Error(HUMAIN_SSO_UNSUPPORTED_MESSAGE);\n\t\t},\n\t\tgetApiKey(): string {\n\t\t\tthrow new Error(HUMAIN_SSO_UNSUPPORTED_MESSAGE);\n\t\t},\n\t};\n}\n\nfunction getHumainCodeModelIds(env: NodeJS.ProcessEnv): string[] {\n\tconst configuredModels = readCsvEnv(env, HUMAIN_CODE_MODELS_ENV);\n\tconst shorthandModels = configuredModels.length > 0 ? configuredModels : readCsvEnv(env, HC_MODELS_ENV);\n\treturn shorthandModels.length > 0 ? shorthandModels : DEFAULT_HUMAIN_CODE_MODELS;\n}\n\nfunction getHumainCodeModels(env: NodeJS.ProcessEnv): ProviderModelConfig[] {\n\treturn getHumainCodeModelIds(env).map((id) => toModelConfig(id));\n}\n\nfunction registerDeployNowBindingProviders(pi: ExtensionAPI, env: NodeJS.ProcessEnv): void {\n\tconst bedrockBaseUrl = readNonEmptyEnv(env, DEPLOYNOW_BEDROCK_BASE_URL_ENV);\n\tconst bedrockModel = getDeployNowBedrockModelId(env);\n\tconst isDeployNowBedrock = bedrockBaseUrl && hasDeployNowBedrockBindingConfig(env);\n\tconst isDirectAwsBedrock = !isDeployNowBedrock && hasDirectAwsCredentials(env);\n\tif (isDeployNowBedrock) {\n\t\t// Forge-managed DeployNow sandbox: uses the broker base URL and the\n\t\t// DeployNow dummy credentials. The bedrock provider exchanges the\n\t\t// dummy credentials for a bearer token against the broker.\n\t\tpi.registerProvider(AMAZON_BEDROCK_PROVIDER, {\n\t\t\tname: \"DeployNow Bedrock Binding\",\n\t\t\tbaseUrl: bedrockBaseUrl,\n\t\t\tapiKey: getDeployNowCredential(env, AWS_ACCESS_KEY_ID_ENV),\n\t\t\tenv: getDeployNowBedrockRequestEnv(env),\n\t\t\tapi: \"bedrock-converse-stream\",\n\t\t\t...(bedrockModel ? { models: [toModelConfig(bedrockModel, \"bedrock-converse-stream\")] } : {}),\n\t\t});\n\t} else if (isDirectAwsBedrock) {\n\t\t// Direct AWS IAM-key auth: Forge (or a manual launch) passed real\n\t\t// AWS credentials through the environment. Register the provider so\n\t\t// the built-in catalog is wired up with the same env; the bedrock\n\t\t// runtime picks up AWS_REGION/AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY\n\t\t// from `options.env` (which wins over `process.env` in the auth\n\t\t// resolve). An optional `ANTHROPIC_BEDROCK_BASE_URL` keeps the proxy\n\t\t// path available without re-introducing the DeployNow sentinel check.\n\t\tpi.registerProvider(AMAZON_BEDROCK_PROVIDER, {\n\t\t\tname: bedrockBaseUrl ? \"Bedrock (custom endpoint)\" : \"Bedrock\",\n\t\t\t...(bedrockBaseUrl ? { baseUrl: bedrockBaseUrl } : {}),\n\t\t\tenv: getDirectAwsBedrockRequestEnv(env),\n\t\t\tapi: \"bedrock-converse-stream\",\n\t\t\t...(bedrockModel ? { models: [toModelConfig(bedrockModel, \"bedrock-converse-stream\")] } : {}),\n\t\t});\n\t}\n\n\tconst anthropicBaseUrl = readNonEmptyEnv(env, DEPLOYNOW_ANTHROPIC_BASE_URL_ENV);\n\tconst anthropicModel = getDeployNowAnthropicModelId(env);\n\tif (anthropicBaseUrl && hasDeployNowAnthropicBindingConfig(env)) {\n\t\tpi.registerProvider(ANTHROPIC_PROVIDER, {\n\t\t\tname: \"DeployNow Anthropic Binding\",\n\t\t\tbaseUrl: anthropicBaseUrl,\n\t\t\tapiKey: getDeployNowCredential(env, ANTHROPIC_API_KEY_ENV),\n\t\t\tapi: \"anthropic-messages\",\n\t\t\t...(anthropicModel ? { models: [toModelConfig(anthropicModel, \"anthropic-messages\")] } : {}),\n\t\t});\n\t}\n\n\tconst openAiBaseUrl = readNonEmptyEnv(env, DEPLOYNOW_OPENAI_BASE_URL_ENV);\n\tconst openAiModel = getDeployNowOpenAiModelId(env);\n\tif (openAiBaseUrl && hasDeployNowOpenAiBindingConfig(env)) {\n\t\tpi.registerProvider(OPENAI_PROVIDER, {\n\t\t\tname: \"DeployNow OpenAI Binding\",\n\t\t\tbaseUrl: openAiBaseUrl,\n\t\t\tapiKey: getDeployNowCredential(env, OPENAI_API_KEY_ENV),\n\t\t\tapi: \"openai-completions\",\n\t\t\t...(openAiModel ? { models: [toModelConfig(openAiModel, \"openai-completions\")] } : {}),\n\t\t});\n\t}\n}\n\nasync function registerHumainProviders(pi: ExtensionAPI, env: NodeJS.ProcessEnv): Promise<void> {\n\tpi.registerProvider(createHumainNodeProvider(env));\n\tconst localBaseUrl = getLocalBaseUrl(env);\n\tconst localModels = await getHumainLocalModelConfigs(env);\n\tif (localBaseUrl && localModels.length > 0) {\n\t\tpi.registerProvider(HUMAIN_LOCAL_PROVIDER, {\n\t\t\tname: \"HUMAIN Local\",\n\t\t\tbaseUrl: localBaseUrl,\n\t\t\tapiKey: getLocalApiKey(env) ?? \"local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tauthHeader: Boolean(getLocalApiKey(env)),\n\t\t\tmodels: localModels,\n\t\t});\n\t}\n\n\tconst humainCodeBaseUrl = getHumainCodeBaseUrl(env);\n\tconst humainCodeApiKey = getHumainCodeApiKey(env);\n\tif (humainCodeBaseUrl && humainCodeApiKey) {\n\t\tpi.registerProvider(HUMAIN_CODE_PROVIDER, {\n\t\t\tname: \"HUMAIN Code\",\n\t\t\tbaseUrl: humainCodeBaseUrl,\n\t\t\tapiKey: humainCodeApiKey,\n\t\t\tapi: \"openai-completions\",\n\t\t\tauthHeader: true,\n\t\t\tmodels: getHumainCodeModels(env),\n\t\t});\n\t}\n\n\tregisterDeployNowBindingProviders(pi, env);\n\n\tpi.registerProvider(HUMAIN_SSO_PROVIDER, {\n\t\tname: \"HUMAIN SSO\",\n\t\toauth: createUnsupportedHumainSsoProvider(),\n\t});\n}\n\nexport function getHumainDefaultPackageSources(): PackageSource[] {\n\treturn [];\n}\n\nexport function createHumainProviderExtensionFactory(\n\tenv: NodeJS.ProcessEnv,\n\thomeDirectory: string = homedir(),\n): ExtensionFactory {\n\treturn async (pi) => {\n\t\tawait registerHumainProviders(pi, env);\n\n\t\tpi.on(\"session_start\", (event, ctx) => {\n\t\t\tif (event.reason === \"startup\") {\n\t\t\t\tctx.ui.setTheme(\"humain-dark\");\n\t\t\t\tcleanupLegacyWorkflowTiers(getLegacyWorkflowTierPaths(homeDirectory));\n\t\t\t}\n\t\t});\n\t};\n}\n\nexport function getHumainBundledExtensionFactories(env: NodeJS.ProcessEnv): ExtensionFactory[] {\n\t// Stable prompt order for caching; explicit ownership resolves conflicts, not injection order.\n\treturn [\n\t\tcreateHumainProviderExtensionFactory(env),\n\t\tcreateHumainWebAccessExtensionFactory(),\n\t\tcreateHumainPonytailExtensionFactory(),\n\t\tcreateHumainCavemanExtensionFactory(),\n\t\tcreateHumainAdhdExtensionFactory(),\n\t\tcreateHumainBtwExtensionFactory(),\n\t\tcreateHumainModeOwnershipExtensionFactory(),\n\t\tcreateHumainFlowLoaderExtensionFactory({ env }),\n\t\tcreateHumainTraceCaptureExtensionFactory(env),\n\t];\n}\n"]}
|
|
@@ -78,6 +78,7 @@ export interface FlowChildLaunchInvocation {
|
|
|
78
78
|
args: readonly string[];
|
|
79
79
|
cwd?: string;
|
|
80
80
|
env?: NodeJS.ProcessEnv;
|
|
81
|
+
stdin?: "pipe" | "ignore";
|
|
81
82
|
stdout?: "pipe" | "inherit" | "ignore";
|
|
82
83
|
stderr?: "pipe" | "inherit" | "ignore";
|
|
83
84
|
/** POSIX detached spawn: process.pid is the new process-group id for caller-owned group cancellation. */
|