@cotal-ai/connector-core 0.24.0 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent.d.ts +92 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +109 -0
- package/dist/agent.js.map +1 -1
- package/dist/config.d.ts +36 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +126 -11
- package/dist/config.js.map +1 -1
- package/dist/control.d.ts +4 -0
- package/dist/control.d.ts.map +1 -1
- package/dist/control.js +12 -1
- package/dist/control.js.map +1 -1
- package/dist/docs-bundle.generated.d.ts.map +1 -1
- package/dist/docs-bundle.generated.js +17 -24
- package/dist/docs-bundle.generated.js.map +1 -1
- package/dist/launch.d.ts +89 -36
- package/dist/launch.d.ts.map +1 -1
- package/dist/launch.js +156 -65
- package/dist/launch.js.map +1 -1
- package/dist/relay.d.ts.map +1 -1
- package/dist/relay.js +52 -7
- package/dist/relay.js.map +1 -1
- package/dist/tool-specs.d.ts +61 -1
- package/dist/tool-specs.d.ts.map +1 -1
- package/dist/tool-specs.js +374 -27
- package/dist/tool-specs.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs-bundle.generated.js","sourceRoot":"","sources":["../src/docs-bundle.generated.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,WAAW,GAAe;IACrC,SAAS,EAAE,QAAQ;IACnB,eAAe,EAAE,mEAAmE;IACpF,OAAO,EAAE;QACP;YACE,MAAM,EAAE,eAAe;YACvB,OAAO,EAAE,eAAe;YACxB,MAAM,EAAE,0BAA0B;YAClC,SAAS,EAAE,+FAA+F;YAC1G,MAAM,EAAE,o6IAAo6I;SAC76I;QACD;YACE,MAAM,EAAE,iBAAiB;YACzB,OAAO,EAAE,YAAY;YACrB,MAAM,EAAE,0BAA0B;YAClC,SAAS,EAAE,gHAAgH;YAC3H,MAAM,EAAE,imVAAimV;SAC1mV;QACD;YACE,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,cAAc;YACvB,MAAM,EAAE,uBAAuB;YAC/B,SAAS,EAAE,wMAAwM;YACnN,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"docs-bundle.generated.js","sourceRoot":"","sources":["../src/docs-bundle.generated.ts"],"names":[],"mappings":"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"}
|
package/dist/launch.d.ts
CHANGED
|
@@ -1,40 +1,75 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The spawned-agent env
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* and
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
2
|
+
* The spawned-agent env (P3) - the single chokepoint for what a child process sees.
|
|
3
|
+
*
|
|
4
|
+
* DEFAULT: a spawned agent INHERITS the operator's environment. A coding harness the operator
|
|
5
|
+
* installed and configured should behave under `cotal spawn` the way it behaves when they run it
|
|
6
|
+
* themselves, and Cotal has no business holding an opinion about which inference providers exist or
|
|
7
|
+
* which variables a harness reads. The list of vendor key names that used to live here was the tell:
|
|
8
|
+
* every new provider needed a change in Cotal before it would work through a managed spawn.
|
|
9
|
+
*
|
|
10
|
+
* EXCEPT Cotal's own `COTAL_*` namespace, which is RESET. That is not an opinion about the
|
|
11
|
+
* operator's environment; it is Cotal refusing to let one agent's identity become another's. A
|
|
12
|
+
* connector re-supplies the `COTAL_*` a child should have, but many of those assignments are
|
|
13
|
+
* CONDITIONAL - {@link aclEnv} omits an empty ACL so the connector can defer to the persona file,
|
|
14
|
+
* {@link materialEnv} returns `{}` when a launch carries nothing to hand over, `if (opts.role)`,
|
|
15
|
+
* `if (opts.lifecycleUid)` - so an inherited value is never overwritten and survives into a child
|
|
16
|
+
* that was never granted it.
|
|
17
|
+
*
|
|
18
|
+
* The prefix is stripped WHOLESALE rather than by a named deny-list, because the danger is
|
|
19
|
+
* ASYMMETRY rather than any single omission: `COTAL_EVENTS` and `COTAL_WORKSPACE_ROOT` are set by
|
|
20
|
+
* opencode/claude/codex and NOT by hermes/pi, `COTAL_CHANNEL` only by claude, `COTAL_VARIANT` only
|
|
21
|
+
* by opencode/codex, the `COTAL_CODEX_*` family only by codex. A hand-maintained deny-list names
|
|
22
|
+
* what its author remembers. The repo has a worked example: six suite files reached main each
|
|
23
|
+
* blanking exactly `COTAL_SPACE`, `COTAL_SERVERS` and `COTAL_CREDS` by hand before spreading
|
|
24
|
+
* `...process.env` into a `cotal attach` child, which let the lifecycle uid, the control token, both
|
|
25
|
+
* identity quads and {@link LAUNCH_MATERIAL_ENV} through to a process that reads connection
|
|
26
|
+
* material. {@link OPERATOR_ENV_KEEP} is the inverse and is safe for the same reason a deny-list is
|
|
27
|
+
* not: every name on it is one no connector assigns per spawn, so a new connector cannot invalidate
|
|
28
|
+
* it by forgetting something.
|
|
29
|
+
*
|
|
30
|
+
* OPT-IN CONTAINMENT: an operator who wants the child confined sets `spawn.env` in the cotal config
|
|
31
|
+
* file; the caller resolves it and passes it as `envAllow`. The child then gets the OS allow-list
|
|
32
|
+
* plus exactly the names declared there, and nothing else.
|
|
33
|
+
*
|
|
34
|
+
* Scope this is HONEST about (P6). NEITHER mode closes filesystem secret access: HOME / XDG /
|
|
35
|
+
* platform config dirs are forwarded either way, so a child with a shell reads ~/.aws, ~/.ssh,
|
|
36
|
+
* ~/.config and ~/.cotal straight off disk. An allow-list stops env-ONLY secrets - an
|
|
37
|
+
* `aws-vault exec` or `op run` shell, CI-injected values - and nothing that has a file behind it.
|
|
38
|
+
* Nor does either mode close model-key exfil: a key-based agent holds its provider key in its own
|
|
39
|
+
* process in order to do inference. What DOES narrow under inherit is that Cotal's own connection
|
|
40
|
+
* material is no longer in the environment at all: {@link materialEnv} moved the credential, the
|
|
41
|
+
* broker address and the control token behind a 0600 file, so what a child now inherits from the
|
|
42
|
+
* `COTAL_*` namespace is a path this function removes, not a secret.
|
|
16
43
|
*/
|
|
17
44
|
import { type McpServerSpec } from "@cotal-ai/core";
|
|
18
|
-
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
45
|
+
/** The `COTAL_*` an operator sets MACHINE-WIDE, which a child legitimately needs. The qualifying
|
|
46
|
+
* property is not "harmless" but "no connector assigns it per spawn": a name no launch path writes
|
|
47
|
+
* cannot carry one agent's grant into another, which is why this list stays correct as connectors
|
|
48
|
+
* are added and a deny-list would not. `COTAL_HOME` is the load-bearing entry - it redirects the
|
|
49
|
+
* mesh registry, and a child that shells out to `cotal` must resolve the one its parent did.
|
|
50
|
+
* `COTAL_CODEX_BIN` and its siblings are operator binary overrides, and sit here precisely BECAUSE
|
|
51
|
+
* the neighbouring per-launch `COTAL_CODEX_HOME`/`_CONFIG`/`_TUI`/`_PROMPT` do not. */
|
|
52
|
+
export declare const OPERATOR_ENV_KEEP: readonly ["COTAL_HOME", "COTAL_FEEDBACK_KEY", "COTAL_FEEDBACK_EMAIL", "COTAL_FEEDBACK_URL", "COTAL_DEFAULT_AGENT", "COTAL_DEFAULT_PERSONA", "COTAL_SKIP_CONNECTOR_SEED", "COTAL_SKIP_ASSIST", "COTAL_DETACH_KEY", "COTAL_COMPLETE_DEBUG", "COTAL_DEBUG", "COTAL_SERVE_HEADLESS", "COTAL_EVENTS_DEFAULT", "COTAL_MEMBERSHIP_INTERVAL_MS", "COTAL_DELIVERY_BROKER_GONE_MS", "COTAL_IDP_TIMEOUT_MS", "COTAL_CODEX_BIN", "COTAL_OPENCODE_BIN", "COTAL_ORCA_BIN"];
|
|
53
|
+
/** Build the base env a spawned agent runs with.
|
|
54
|
+
*
|
|
55
|
+
* DEFAULT (`envAllow` absent): the operator's environment minus {@link SESSION_ENV_PREFIX}, keeping
|
|
56
|
+
* {@link OPERATOR_ENV_KEEP}. The connector layers this child's own `COTAL_*` on top, so every
|
|
57
|
+
* per-session name it ends up with was granted to IT.
|
|
58
|
+
*
|
|
59
|
+
* OPT-IN (`envAllow` present, from the config file's `spawn.env`): the OS allow-list plus exactly
|
|
60
|
+
* the declared names and `mcpKeys` (the `${VAR}` secrets a shared MCP server references, see
|
|
61
|
+
* {@link mcpServerEnvKeys}). Each is copied BY NAME and only when present. An EMPTY array is a real
|
|
62
|
+
* policy - the OS allow-list alone - and not "unset", which is why the mode is chosen on
|
|
63
|
+
* `!== undefined` rather than on length.
|
|
64
|
+
*
|
|
65
|
+
* Allow-list matching is CASE-INSENSITIVE and each value is copied under the OS's OWN key casing:
|
|
66
|
+
* Windows spells these `Path`/`ComSpec`/`windir`, so a canonical-only copy would either miss them
|
|
67
|
+
* (a plain read of `process.env.SystemRoot` differs from `process.env.systemroot`) or, worse, emit
|
|
68
|
+
* BOTH `Path` and `PATH` - a case-duplicate Windows process creation chokes on. Keying off the
|
|
69
|
+
* source env's actual casing (one entry per lowercased name) forwards each var exactly once. */
|
|
35
70
|
export declare function launchEnv(opts?: {
|
|
36
|
-
providerKeys?: readonly string[];
|
|
37
71
|
mcpKeys?: readonly string[];
|
|
72
|
+
envAllow?: readonly string[];
|
|
38
73
|
}): Record<string, string>;
|
|
39
74
|
/** The agent's resolved access policy as `COTAL_*` env, when present. Forwarded by each connector
|
|
40
75
|
* so the spawned session's runtime read/post set matches the creds the manager minted from the
|
|
@@ -60,11 +95,29 @@ export declare function aclEnv(opts: {
|
|
|
60
95
|
* would corrupt the config object or garble a rendered flag. Core never sees this; each connector
|
|
61
96
|
* calls it for the surface IT renders. */
|
|
62
97
|
export declare function connectorLaunchOptions(connector: string, launchOptions: Record<string, unknown> | undefined): [string, unknown][];
|
|
63
|
-
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
|
|
98
|
+
/**
|
|
99
|
+
* The launch's CONNECTION MATERIAL as a private file, and one env entry naming it.
|
|
100
|
+
*
|
|
101
|
+
* This replaces `userAuthEnv` and the per-connector `COTAL_CREDS` / `COTAL_SERVERS` /
|
|
102
|
+
* `COTAL_CONTROL_TOKEN` assignments it used to sit beside. Those put the broker address, the
|
|
103
|
+
* credential and a control-plane bearer into the seat's process environment, which every descendant
|
|
104
|
+
* of the seat inherits: the build it runs, the linter, the third-party CLI, the test suite that
|
|
105
|
+
* reads its broker from the environment. Nothing in that chain asked for any of it, and there is no
|
|
106
|
+
* moment where a human sees a credential being handed over, so there is no natural moment to object.
|
|
107
|
+
*
|
|
108
|
+
* Now they ride a 0600 file (see `writeLaunchMaterial`) and only its PATH is exported. The identity
|
|
109
|
+
* that is not secret - space, name, role, id, lifecycle uid, the ACLs, the control SOCKET path -
|
|
110
|
+
* stays in the environment where the launcher's contract has always put it, because a descendant
|
|
111
|
+
* learning the seat's name is not the failure.
|
|
112
|
+
*
|
|
113
|
+
* Refuses a creds+userAuth combination here (one launch, one identity plane - U10), which is where
|
|
114
|
+
* `userAuthEnv` refused it.
|
|
115
|
+
*/
|
|
116
|
+
export declare function materialEnv(opts: {
|
|
67
117
|
creds?: string;
|
|
118
|
+
servers?: string;
|
|
119
|
+
token?: string;
|
|
120
|
+
controlToken?: string;
|
|
68
121
|
userAuth?: {
|
|
69
122
|
owner: string;
|
|
70
123
|
actor: string;
|
package/dist/launch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../src/launch.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../src/launch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,OAAO,EAOL,KAAK,aAAa,EACnB,MAAM,gBAAgB,CAAC;AA+DxB;;;;;;wFAMwF;AACxF,eAAO,MAAM,iBAAiB,8bAoBpB,CAAC;AAEX;;;;;;;;;;;;;;;;iGAgBiG;AACjG,wBAAgB,SAAS,CACvB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAO,GACvE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BxB;AAED;;;;;mFAKmF;AACnF,wBAAgB,MAAM,CAAC,IAAI,EAAE;IAC3B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUzB;AAgBD;;;;;;;;;;2CAU2C;AAC3C,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACjD,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAMrB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC7F,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAczB;AAED;;;;;;;;;;;;;;;;qFAgBqF;AACrF,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,qBAAqB,EACrB,cAAc,GACf,MAAM,gBAAgB,CAAC;AAExB;;;;;;;;;;;;6CAY6C;AAC7C,wBAAgB,sBAAsB,CACpC,EAAE,EAAE;IAAE,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,gBAAgB,EAAE,OAAO,CAAA;CAAE,GAC7E,MAAM,CASR;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAC9E,MAAM,CAwCR;AAED;;;;kEAIkE;AAClE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,MAAM,EAAE,CAcjF"}
|
package/dist/launch.js
CHANGED
|
@@ -1,20 +1,47 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The spawned-agent env
|
|
2
|
+
* The spawned-agent env (P3) - the single chokepoint for what a child process sees.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* and
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* DEFAULT: a spawned agent INHERITS the operator's environment. A coding harness the operator
|
|
5
|
+
* installed and configured should behave under `cotal spawn` the way it behaves when they run it
|
|
6
|
+
* themselves, and Cotal has no business holding an opinion about which inference providers exist or
|
|
7
|
+
* which variables a harness reads. The list of vendor key names that used to live here was the tell:
|
|
8
|
+
* every new provider needed a change in Cotal before it would work through a managed spawn.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
10
|
+
* EXCEPT Cotal's own `COTAL_*` namespace, which is RESET. That is not an opinion about the
|
|
11
|
+
* operator's environment; it is Cotal refusing to let one agent's identity become another's. A
|
|
12
|
+
* connector re-supplies the `COTAL_*` a child should have, but many of those assignments are
|
|
13
|
+
* CONDITIONAL - {@link aclEnv} omits an empty ACL so the connector can defer to the persona file,
|
|
14
|
+
* {@link materialEnv} returns `{}` when a launch carries nothing to hand over, `if (opts.role)`,
|
|
15
|
+
* `if (opts.lifecycleUid)` - so an inherited value is never overwritten and survives into a child
|
|
16
|
+
* that was never granted it.
|
|
17
|
+
*
|
|
18
|
+
* The prefix is stripped WHOLESALE rather than by a named deny-list, because the danger is
|
|
19
|
+
* ASYMMETRY rather than any single omission: `COTAL_EVENTS` and `COTAL_WORKSPACE_ROOT` are set by
|
|
20
|
+
* opencode/claude/codex and NOT by hermes/pi, `COTAL_CHANNEL` only by claude, `COTAL_VARIANT` only
|
|
21
|
+
* by opencode/codex, the `COTAL_CODEX_*` family only by codex. A hand-maintained deny-list names
|
|
22
|
+
* what its author remembers. The repo has a worked example: six suite files reached main each
|
|
23
|
+
* blanking exactly `COTAL_SPACE`, `COTAL_SERVERS` and `COTAL_CREDS` by hand before spreading
|
|
24
|
+
* `...process.env` into a `cotal attach` child, which let the lifecycle uid, the control token, both
|
|
25
|
+
* identity quads and {@link LAUNCH_MATERIAL_ENV} through to a process that reads connection
|
|
26
|
+
* material. {@link OPERATOR_ENV_KEEP} is the inverse and is safe for the same reason a deny-list is
|
|
27
|
+
* not: every name on it is one no connector assigns per spawn, so a new connector cannot invalidate
|
|
28
|
+
* it by forgetting something.
|
|
29
|
+
*
|
|
30
|
+
* OPT-IN CONTAINMENT: an operator who wants the child confined sets `spawn.env` in the cotal config
|
|
31
|
+
* file; the caller resolves it and passes it as `envAllow`. The child then gets the OS allow-list
|
|
32
|
+
* plus exactly the names declared there, and nothing else.
|
|
33
|
+
*
|
|
34
|
+
* Scope this is HONEST about (P6). NEITHER mode closes filesystem secret access: HOME / XDG /
|
|
35
|
+
* platform config dirs are forwarded either way, so a child with a shell reads ~/.aws, ~/.ssh,
|
|
36
|
+
* ~/.config and ~/.cotal straight off disk. An allow-list stops env-ONLY secrets - an
|
|
37
|
+
* `aws-vault exec` or `op run` shell, CI-injected values - and nothing that has a file behind it.
|
|
38
|
+
* Nor does either mode close model-key exfil: a key-based agent holds its provider key in its own
|
|
39
|
+
* process in order to do inference. What DOES narrow under inherit is that Cotal's own connection
|
|
40
|
+
* material is no longer in the environment at all: {@link materialEnv} moved the credential, the
|
|
41
|
+
* broker address and the control token behind a 0600 file, so what a child now inherits from the
|
|
42
|
+
* `COTAL_*` namespace is a path this function removes, not a secret.
|
|
16
43
|
*/
|
|
17
|
-
import { eventChannel, parsePrincipalKey, principalKey } from "@cotal-ai/core";
|
|
44
|
+
import { eventChannel, LAUNCH_MATERIAL_ENV, parsePrincipalKey, principalKey, writeLaunchMaterial, } from "@cotal-ai/core";
|
|
18
45
|
/** OS env a coding-agent TUI genuinely needs to run — find its binary (PATH), render (TERM /
|
|
19
46
|
* COLORTERM), resolve home/config/data roots (HOME / XDG_*_HOME on Unix,
|
|
20
47
|
* USERPROFILE / APPDATA / LOCALAPPDATA on Windows), locale (LANG / LC_*), timezone (TZ), temp
|
|
@@ -70,49 +97,89 @@ const OS_ENV_ALLOW = [
|
|
|
70
97
|
"CommonProgramFiles",
|
|
71
98
|
"PUBLIC",
|
|
72
99
|
];
|
|
73
|
-
/**
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
100
|
+
/** Cotal's own per-session namespace. Everything under this prefix is reset before a child starts,
|
|
101
|
+
* except {@link OPERATOR_ENV_KEEP}. Compared case-INSENSITIVELY: Windows env lookup is
|
|
102
|
+
* case-insensitive, so a stray `Cotal_Creds` must not slip past a case-sensitive test. */
|
|
103
|
+
const SESSION_ENV_PREFIX = "COTAL_";
|
|
104
|
+
/** The `COTAL_*` an operator sets MACHINE-WIDE, which a child legitimately needs. The qualifying
|
|
105
|
+
* property is not "harmless" but "no connector assigns it per spawn": a name no launch path writes
|
|
106
|
+
* cannot carry one agent's grant into another, which is why this list stays correct as connectors
|
|
107
|
+
* are added and a deny-list would not. `COTAL_HOME` is the load-bearing entry - it redirects the
|
|
108
|
+
* mesh registry, and a child that shells out to `cotal` must resolve the one its parent did.
|
|
109
|
+
* `COTAL_CODEX_BIN` and its siblings are operator binary overrides, and sit here precisely BECAUSE
|
|
110
|
+
* the neighbouring per-launch `COTAL_CODEX_HOME`/`_CONFIG`/`_TUI`/`_PROMPT` do not. */
|
|
111
|
+
export const OPERATOR_ENV_KEEP = [
|
|
112
|
+
"COTAL_HOME",
|
|
113
|
+
"COTAL_FEEDBACK_KEY",
|
|
114
|
+
"COTAL_FEEDBACK_EMAIL",
|
|
115
|
+
"COTAL_FEEDBACK_URL",
|
|
116
|
+
"COTAL_DEFAULT_AGENT",
|
|
117
|
+
"COTAL_DEFAULT_PERSONA",
|
|
118
|
+
"COTAL_SKIP_CONNECTOR_SEED",
|
|
119
|
+
"COTAL_SKIP_ASSIST",
|
|
120
|
+
"COTAL_DETACH_KEY",
|
|
121
|
+
"COTAL_COMPLETE_DEBUG",
|
|
122
|
+
"COTAL_DEBUG",
|
|
123
|
+
"COTAL_SERVE_HEADLESS",
|
|
124
|
+
"COTAL_EVENTS_DEFAULT",
|
|
125
|
+
"COTAL_MEMBERSHIP_INTERVAL_MS",
|
|
126
|
+
"COTAL_DELIVERY_BROKER_GONE_MS",
|
|
127
|
+
"COTAL_IDP_TIMEOUT_MS",
|
|
128
|
+
"COTAL_CODEX_BIN",
|
|
129
|
+
"COTAL_OPENCODE_BIN",
|
|
130
|
+
"COTAL_ORCA_BIN",
|
|
85
131
|
];
|
|
86
|
-
/** Build the base env a spawned agent runs with
|
|
87
|
-
* connector declares the agent needs — `providerKeys` (the model-provider key) and `mcpKeys`
|
|
88
|
-
* (the `${VAR}` secrets a shared MCP server references, see {@link mcpServerEnvKeys}). Every entry
|
|
89
|
-
* is copied from the manager's env BY NAME and only when present — never required, never spread
|
|
90
|
-
* wholesale, so the operator's unrelated secrets don't bleed into the child (P3).
|
|
132
|
+
/** Build the base env a spawned agent runs with.
|
|
91
133
|
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
134
|
+
* DEFAULT (`envAllow` absent): the operator's environment minus {@link SESSION_ENV_PREFIX}, keeping
|
|
135
|
+
* {@link OPERATOR_ENV_KEEP}. The connector layers this child's own `COTAL_*` on top, so every
|
|
136
|
+
* per-session name it ends up with was granted to IT.
|
|
137
|
+
*
|
|
138
|
+
* OPT-IN (`envAllow` present, from the config file's `spawn.env`): the OS allow-list plus exactly
|
|
139
|
+
* the declared names and `mcpKeys` (the `${VAR}` secrets a shared MCP server references, see
|
|
140
|
+
* {@link mcpServerEnvKeys}). Each is copied BY NAME and only when present. An EMPTY array is a real
|
|
141
|
+
* policy - the OS allow-list alone - and not "unset", which is why the mode is chosen on
|
|
142
|
+
* `!== undefined` rather than on length.
|
|
143
|
+
*
|
|
144
|
+
* Allow-list matching is CASE-INSENSITIVE and each value is copied under the OS's OWN key casing:
|
|
145
|
+
* Windows spells these `Path`/`ComSpec`/`windir`, so a canonical-only copy would either miss them
|
|
146
|
+
* (a plain read of `process.env.SystemRoot` differs from `process.env.systemroot`) or, worse, emit
|
|
147
|
+
* BOTH `Path` and `PATH` - a case-duplicate Windows process creation chokes on. Keying off the
|
|
148
|
+
* source env's actual casing (one entry per lowercased name) forwards each var exactly once. */
|
|
97
149
|
export function launchEnv(opts = {}) {
|
|
150
|
+
if (opts.envAllow !== undefined) {
|
|
151
|
+
const env = {};
|
|
152
|
+
// lowercased name -> the OS's actual key casing; one entry per var (the OS env has no case-dup),
|
|
153
|
+
// so every allow-list name resolves to a single source key and the result carries no case-dup.
|
|
154
|
+
const sourceKey = new Map();
|
|
155
|
+
for (const k of Object.keys(process.env))
|
|
156
|
+
sourceKey.set(k.toLowerCase(), k);
|
|
157
|
+
const copy = (name) => {
|
|
158
|
+
const src = sourceKey.get(name.toLowerCase());
|
|
159
|
+
if (src === undefined)
|
|
160
|
+
return;
|
|
161
|
+
const v = process.env[src];
|
|
162
|
+
if (v !== undefined)
|
|
163
|
+
env[src] = v;
|
|
164
|
+
};
|
|
165
|
+
for (const k of OS_ENV_ALLOW)
|
|
166
|
+
copy(k);
|
|
167
|
+
for (const k of [...opts.envAllow, ...(opts.mcpKeys ?? [])])
|
|
168
|
+
copy(k);
|
|
169
|
+
return env;
|
|
170
|
+
}
|
|
171
|
+
// Inherit. `mcpKeys` needs no handling in this mode: a `${VAR}` a shared MCP server references is
|
|
172
|
+
// already in the operator's environment, which is what the child is being given.
|
|
173
|
+
const keep = new Set(OPERATOR_ENV_KEEP);
|
|
98
174
|
const env = {};
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
return;
|
|
108
|
-
const v = process.env[src];
|
|
109
|
-
if (v !== undefined)
|
|
110
|
-
env[src] = v;
|
|
111
|
-
};
|
|
112
|
-
for (const k of OS_ENV_ALLOW)
|
|
113
|
-
copy(k);
|
|
114
|
-
for (const k of [...(opts.providerKeys ?? []), ...(opts.mcpKeys ?? [])])
|
|
115
|
-
copy(k);
|
|
175
|
+
for (const [k, v] of Object.entries(process.env)) {
|
|
176
|
+
if (v === undefined)
|
|
177
|
+
continue;
|
|
178
|
+
const canon = k.toUpperCase();
|
|
179
|
+
if (canon.startsWith(SESSION_ENV_PREFIX) && !keep.has(canon))
|
|
180
|
+
continue;
|
|
181
|
+
env[k] = v;
|
|
182
|
+
}
|
|
116
183
|
return env;
|
|
117
184
|
}
|
|
118
185
|
/** The agent's resolved access policy as `COTAL_*` env, when present. Forwarded by each connector
|
|
@@ -167,20 +234,44 @@ export function connectorLaunchOptions(connector, launchOptions) {
|
|
|
167
234
|
throw new Error(`${connector} connector: launch option key ${JSON.stringify(k)} is not a valid flag name`);
|
|
168
235
|
return Object.entries(launchOptions);
|
|
169
236
|
}
|
|
170
|
-
/**
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
237
|
+
/**
|
|
238
|
+
* The launch's CONNECTION MATERIAL as a private file, and one env entry naming it.
|
|
239
|
+
*
|
|
240
|
+
* This replaces `userAuthEnv` and the per-connector `COTAL_CREDS` / `COTAL_SERVERS` /
|
|
241
|
+
* `COTAL_CONTROL_TOKEN` assignments it used to sit beside. Those put the broker address, the
|
|
242
|
+
* credential and a control-plane bearer into the seat's process environment, which every descendant
|
|
243
|
+
* of the seat inherits: the build it runs, the linter, the third-party CLI, the test suite that
|
|
244
|
+
* reads its broker from the environment. Nothing in that chain asked for any of it, and there is no
|
|
245
|
+
* moment where a human sees a credential being handed over, so there is no natural moment to object.
|
|
246
|
+
*
|
|
247
|
+
* Now they ride a 0600 file (see `writeLaunchMaterial`) and only its PATH is exported. The identity
|
|
248
|
+
* that is not secret - space, name, role, id, lifecycle uid, the ACLs, the control SOCKET path -
|
|
249
|
+
* stays in the environment where the launcher's contract has always put it, because a descendant
|
|
250
|
+
* learning the seat's name is not the failure.
|
|
251
|
+
*
|
|
252
|
+
* Refuses a creds+userAuth combination here (one launch, one identity plane - U10), which is where
|
|
253
|
+
* `userAuthEnv` refused it.
|
|
254
|
+
*/
|
|
255
|
+
export function materialEnv(opts) {
|
|
256
|
+
if (opts.userAuth && opts.creds)
|
|
177
257
|
throw new Error("launch: creds (static auth) and userAuth (user-mode auth) are mutually exclusive — one launch carries one identity plane");
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
258
|
+
const material = {};
|
|
259
|
+
if (opts.creds)
|
|
260
|
+
material.creds = opts.creds;
|
|
261
|
+
if (opts.servers)
|
|
262
|
+
material.servers = opts.servers;
|
|
263
|
+
if (opts.token)
|
|
264
|
+
material.token = opts.token;
|
|
265
|
+
if (opts.controlToken)
|
|
266
|
+
material.controlToken = opts.controlToken;
|
|
267
|
+
if (opts.userAuth)
|
|
268
|
+
material.userAuth = opts.userAuth;
|
|
269
|
+
// Nothing to hand over (an open mesh launched with no control endpoint) → no file and no env
|
|
270
|
+
// entry, rather than a file that says nothing. writeLaunchMaterial refuses the empty case too;
|
|
271
|
+
// this is the caller-side half of the same rule.
|
|
272
|
+
if (Object.keys(material).length === 0)
|
|
273
|
+
return {};
|
|
274
|
+
return { [LAUNCH_MATERIAL_ENV]: writeLaunchMaterial(material) };
|
|
184
275
|
}
|
|
185
276
|
/** The per-agent EVENT channel and its classifier, RE-EXPORTED FROM CORE.
|
|
186
277
|
*
|
package/dist/launch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../src/launch.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../src/launch.ts"],"names":[],"mappings":"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"}
|
package/dist/relay.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"AAoFA,6FAA6F;AAC7F,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAuFlD"}
|
package/dist/relay.js
CHANGED
|
@@ -8,9 +8,39 @@
|
|
|
8
8
|
* entry points are one-liners over {@link runHookRelay}.
|
|
9
9
|
*/
|
|
10
10
|
import { connect } from "node:net";
|
|
11
|
-
import { hasIdentity } from "./config.js";
|
|
11
|
+
import { controlFromEnv, hasIdentity } from "./config.js";
|
|
12
12
|
import { HANDOFF_RECEIPT } from "./control.js";
|
|
13
13
|
const TIMEOUT_MS = 2000;
|
|
14
|
+
/**
|
|
15
|
+
* One bounded warning per hook process, on stderr, with no values in it.
|
|
16
|
+
*
|
|
17
|
+
* FAIL OPEN IS NOT THE SAME AS FAIL SILENT, and this relay was doing both. A hook that throws is a
|
|
18
|
+
* hook that blocked a human's session, so the catch below stays. But a material file that is
|
|
19
|
+
* missing, permissive, malformed, or contradicted by a direct carrier used to produce a hook that
|
|
20
|
+
* did nothing and said nothing: the seat runs, presence never advances, no queued peer message is
|
|
21
|
+
* ever injected, and there is no line anywhere to read. That is the same failure this connector's
|
|
22
|
+
* Python counterpart shipped, one connector over, and it is why the repair is a WARNING rather than
|
|
23
|
+
* a stricter refusal.
|
|
24
|
+
*
|
|
25
|
+
* Bounded means once per process, and the runtime starts one hook process per lifecycle event, so a
|
|
26
|
+
* genuinely broken session keeps saying so. That is the intended trade: the alternative is a single
|
|
27
|
+
* line early in a session that scrolls away, for a fault that persists until someone fixes the
|
|
28
|
+
* launch. Nothing is interpolated into the message. The variable NAMES are the diagnosis and the
|
|
29
|
+
* operator can read their own environment; a value in a hook's stderr is a disclosure in whatever
|
|
30
|
+
* captures that stream.
|
|
31
|
+
*/
|
|
32
|
+
let warned = false;
|
|
33
|
+
function warnOnce(message) {
|
|
34
|
+
if (warned)
|
|
35
|
+
return;
|
|
36
|
+
warned = true;
|
|
37
|
+
try {
|
|
38
|
+
process.stderr.write(`[cotal-connector] ${message}\n`);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
/* a hook that cannot even warn still must not block the session */
|
|
42
|
+
}
|
|
43
|
+
}
|
|
14
44
|
function readStdin() {
|
|
15
45
|
return new Promise((resolve) => {
|
|
16
46
|
if (process.stdin.isTTY)
|
|
@@ -56,13 +86,28 @@ function done(out, confirm) {
|
|
|
56
86
|
export async function runHookRelay() {
|
|
57
87
|
if (!hasIdentity())
|
|
58
88
|
return done(""); // plain session, not a managed one — no-op
|
|
59
|
-
//
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
89
|
+
// The socket path comes from the launch env; the token comes from the launch-material file that
|
|
90
|
+
// env points at (the same file the in-agent server reads), never recomputed from public identity.
|
|
91
|
+
// A malformed or missing material file THROWS from controlFromEnv, and a hook that throws is a
|
|
92
|
+
// hook that blocked the session, so it is caught here and treated as "no control session": fail
|
|
93
|
+
// open is this relay's whole contract.
|
|
94
|
+
let control;
|
|
95
|
+
try {
|
|
96
|
+
control = controlFromEnv();
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
warnOnce("this session's control endpoint could not be resolved: the launch material is missing, " +
|
|
100
|
+
"unreadable, readable beyond its owner, malformed, or contradicted by direct COTAL_ variables. " +
|
|
101
|
+
"Lifecycle relays are disabled for this session, so presence will not advance and queued peer " +
|
|
102
|
+
"messages will not be injected. Check COTAL_LAUNCH_MATERIAL and COTAL_CONTROL_SOCKET.");
|
|
103
|
+
return done("");
|
|
104
|
+
}
|
|
105
|
+
// No control endpoint AT ALL is not a fault and is not warned about: a hand-driven session that
|
|
106
|
+
// sets COTAL_NAME and never had a control socket is a legitimate launch, and warning here would
|
|
107
|
+
// fire on every hook of a working session and teach the operator to ignore the channel.
|
|
108
|
+
if (!control)
|
|
65
109
|
return done("");
|
|
110
|
+
const { path, token } = control;
|
|
66
111
|
const raw = (await readStdin()).trim() || "{}";
|
|
67
112
|
let event = {};
|
|
68
113
|
try {
|
package/dist/relay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"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"}
|