@inhuman.tools/harness-sdk 0.0.0-stage → 0.1.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/LICENSE.md +7 -0
- package/dist/client-agents-tree.d.ts +123 -0
- package/dist/client-agents-tree.d.ts.map +1 -0
- package/dist/client-agents-tree.js +504 -0
- package/dist/client-agents-tree.js.map +1 -0
- package/dist/client-agents.d.ts +50 -0
- package/dist/client-agents.d.ts.map +1 -0
- package/dist/client-agents.js +299 -0
- package/dist/client-agents.js.map +1 -0
- package/dist/client.d.ts +89 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +589 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/launch/continue-pick.d.ts +17 -0
- package/dist/launch/continue-pick.d.ts.map +1 -0
- package/dist/launch/continue-pick.js +20 -0
- package/dist/launch/continue-pick.js.map +1 -0
- package/dist/launch/index.d.ts +6 -0
- package/dist/launch/index.d.ts.map +1 -0
- package/dist/launch/index.js +6 -0
- package/dist/launch/index.js.map +1 -0
- package/dist/launch/model-flags.d.ts +44 -0
- package/dist/launch/model-flags.d.ts.map +1 -0
- package/dist/launch/model-flags.js +216 -0
- package/dist/launch/model-flags.js.map +1 -0
- package/dist/launch/streams.d.ts +15 -0
- package/dist/launch/streams.d.ts.map +1 -0
- package/dist/launch/streams.js +2 -0
- package/dist/launch/streams.js.map +1 -0
- package/dist/launch/term-continue.d.ts +13 -0
- package/dist/launch/term-continue.d.ts.map +1 -0
- package/dist/launch/term-continue.js +17 -0
- package/dist/launch/term-continue.js.map +1 -0
- package/dist/launch/term-session-key.d.ts +8 -0
- package/dist/launch/term-session-key.d.ts.map +1 -0
- package/dist/launch/term-session-key.js +76 -0
- package/dist/launch/term-session-key.js.map +1 -0
- package/dist/observable-abort-signal.d.ts +7 -0
- package/dist/observable-abort-signal.d.ts.map +1 -0
- package/dist/observable-abort-signal.js +56 -0
- package/dist/observable-abort-signal.js.map +1 -0
- package/dist/open-external.d.ts +2 -0
- package/dist/open-external.d.ts.map +1 -0
- package/dist/open-external.js +24 -0
- package/dist/open-external.js.map +1 -0
- package/dist/paths.d.ts +7 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +16 -0
- package/dist/paths.js.map +1 -0
- package/dist/text/agent-cover.d.ts +43 -0
- package/dist/text/agent-cover.d.ts.map +1 -0
- package/dist/text/agent-cover.js +123 -0
- package/dist/text/agent-cover.js.map +1 -0
- package/dist/text/format-shell.d.ts +5 -0
- package/dist/text/format-shell.d.ts.map +1 -0
- package/dist/text/format-shell.js +53 -0
- package/dist/text/format-shell.js.map +1 -0
- package/dist/text/identity.d.ts +67 -0
- package/dist/text/identity.d.ts.map +1 -0
- package/dist/text/identity.js +433 -0
- package/dist/text/identity.js.map +1 -0
- package/dist/text/index.d.ts +14 -0
- package/dist/text/index.d.ts.map +1 -0
- package/dist/text/index.js +15 -0
- package/dist/text/index.js.map +1 -0
- package/dist/text/liveness.d.ts +62 -0
- package/dist/text/liveness.d.ts.map +1 -0
- package/dist/text/liveness.js +270 -0
- package/dist/text/liveness.js.map +1 -0
- package/dist/text/mcp-identity.d.ts +25 -0
- package/dist/text/mcp-identity.d.ts.map +1 -0
- package/dist/text/mcp-identity.js +133 -0
- package/dist/text/mcp-identity.js.map +1 -0
- package/dist/text/pretty-identity.d.ts +15 -0
- package/dist/text/pretty-identity.d.ts.map +1 -0
- package/dist/text/pretty-identity.js +112 -0
- package/dist/text/pretty-identity.js.map +1 -0
- package/dist/text/sugarcoat.d.ts +29 -0
- package/dist/text/sugarcoat.d.ts.map +1 -0
- package/dist/text/sugarcoat.js +148 -0
- package/dist/text/sugarcoat.js.map +1 -0
- package/dist/text/unwrap-program.d.ts +2 -0
- package/dist/text/unwrap-program.d.ts.map +1 -0
- package/dist/text/unwrap-program.js +137 -0
- package/dist/text/unwrap-program.js.map +1 -0
- package/dist/text/work-text.d.ts +72 -0
- package/dist/text/work-text.d.ts.map +1 -0
- package/dist/text/work-text.js +337 -0
- package/dist/text/work-text.js.map +1 -0
- package/dist/transport/unix.d.ts +19 -0
- package/dist/transport/unix.d.ts.map +1 -0
- package/dist/transport/unix.js +68 -0
- package/dist/transport/unix.js.map +1 -0
- package/package.json +79 -3
- package/src/client-agents-tree.ts +642 -0
- package/src/client-agents.ts +230 -0
- package/src/client.ts +686 -0
- package/src/index.ts +27 -0
- package/src/launch/continue-pick.ts +28 -0
- package/src/launch/index.ts +5 -0
- package/src/launch/model-flags.ts +273 -0
- package/src/launch/streams.ts +13 -0
- package/src/launch/term-continue.ts +31 -0
- package/src/launch/term-session-key.ts +70 -0
- package/src/observable-abort-signal.ts +66 -0
- package/src/open-external.ts +22 -0
- package/src/paths.ts +20 -0
- package/src/text/agent-cover.ts +136 -0
- package/src/text/format-shell.ts +52 -0
- package/src/text/identity.ts +473 -0
- package/src/text/index.ts +29 -0
- package/src/text/liveness.ts +322 -0
- package/src/text/mcp-identity.ts +148 -0
- package/src/text/pretty-identity.ts +120 -0
- package/src/text/sugarcoat.ts +165 -0
- package/src/text/unwrap-program.ts +133 -0
- package/src/text/work-text.ts +388 -0
- package/src/transport/unix.ts +84 -0
- package/README.md +0 -3
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `--continue` attach target. Glance has no path — a global orphan would
|
|
3
|
+
* be cwd-wrong, so no mapping still mints.
|
|
4
|
+
*/
|
|
5
|
+
import { type UnseatedConversationOverview } from "@inhuman.tools/harness-model";
|
|
6
|
+
export type ContinuePick = {
|
|
7
|
+
readonly sessionId: string | undefined;
|
|
8
|
+
readonly staleKeyToClear: string | null;
|
|
9
|
+
};
|
|
10
|
+
export declare function pickContinueSession(args: {
|
|
11
|
+
readonly key: string | null;
|
|
12
|
+
readonly termContinue: Record<string, string>;
|
|
13
|
+
readonly sessions: Record<string, UnseatedConversationOverview | undefined>;
|
|
14
|
+
readonly occupied: ReadonlySet<string>;
|
|
15
|
+
readonly sessionExists: (id: string) => Promise<boolean>;
|
|
16
|
+
}): Promise<ContinuePick>;
|
|
17
|
+
//# sourceMappingURL=continue-pick.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"continue-pick.d.ts","sourceRoot":"","sources":["../../src/launch/continue-pick.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAA2B,KAAK,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAE1G,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC,CAAC;AAEF,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,4BAA4B,GAAG,SAAS,CAAC,CAAC;IAC5E,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D,GAAG,OAAO,CAAC,YAAY,CAAC,CAUxB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `--continue` attach target. Glance has no path — a global orphan would
|
|
3
|
+
* be cwd-wrong, so no mapping still mints.
|
|
4
|
+
*/
|
|
5
|
+
import { unseatedConversationIds } from "@inhuman.tools/harness-model";
|
|
6
|
+
export async function pickContinueSession(args) {
|
|
7
|
+
const mapped = args.key == null ? undefined : args.termContinue[args.key];
|
|
8
|
+
if (mapped == null || mapped === "")
|
|
9
|
+
return { sessionId: undefined, staleKeyToClear: null };
|
|
10
|
+
const exists = await args.sessionExists(mapped);
|
|
11
|
+
if (exists && !args.occupied.has(mapped))
|
|
12
|
+
return { sessionId: mapped, staleKeyToClear: null };
|
|
13
|
+
const staleKeyToClear = !exists && args.key != null ? args.key : null;
|
|
14
|
+
for (const id of unseatedConversationIds(args.sessions, args.occupied)) {
|
|
15
|
+
if (await args.sessionExists(id))
|
|
16
|
+
return { sessionId: id, staleKeyToClear };
|
|
17
|
+
}
|
|
18
|
+
return { sessionId: undefined, staleKeyToClear };
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=continue-pick.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"continue-pick.js","sourceRoot":"","sources":["../../src/launch/continue-pick.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,uBAAuB,EAAqC,MAAM,8BAA8B,CAAC;AAO1G,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAMzC;IACC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1E,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;IAC5F,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;IAC9F,MAAM,eAAe,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACtE,KAAK,MAAM,EAAE,IAAI,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvE,IAAI,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/launch/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/launch/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `--connection` / `--model` resolve against live completion catalogs.
|
|
3
|
+
* Session apply is the same kv/set `/model` writes. Unsupported verbs crash
|
|
4
|
+
* before the daemon work they would otherwise start.
|
|
5
|
+
*/
|
|
6
|
+
import type { KernelRpc } from "../client.js";
|
|
7
|
+
export type CliAgentFlags = {
|
|
8
|
+
readonly connection?: string;
|
|
9
|
+
readonly model?: string;
|
|
10
|
+
};
|
|
11
|
+
export type ResolvedAgent = {
|
|
12
|
+
readonly connection: string;
|
|
13
|
+
readonly model?: string;
|
|
14
|
+
};
|
|
15
|
+
export type ConnectionRow = {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly name: string;
|
|
18
|
+
readonly driver: string;
|
|
19
|
+
readonly abilityClaim: readonly string[];
|
|
20
|
+
readonly enabled: boolean;
|
|
21
|
+
};
|
|
22
|
+
export type CompletionCatalogRow = {
|
|
23
|
+
readonly id: string;
|
|
24
|
+
readonly models: readonly string[];
|
|
25
|
+
readonly error: string;
|
|
26
|
+
};
|
|
27
|
+
export type ResolveAgentInput = {
|
|
28
|
+
readonly flags: CliAgentFlags;
|
|
29
|
+
readonly connections: readonly ConnectionRow[];
|
|
30
|
+
readonly catalogs?: readonly CompletionCatalogRow[];
|
|
31
|
+
};
|
|
32
|
+
export type ResolveAgentResult = {
|
|
33
|
+
readonly ok: true;
|
|
34
|
+
readonly agent: ResolvedAgent;
|
|
35
|
+
} | {
|
|
36
|
+
readonly ok: false;
|
|
37
|
+
readonly error: string;
|
|
38
|
+
};
|
|
39
|
+
export declare function hasCliAgentFlags(flags: CliAgentFlags): boolean;
|
|
40
|
+
export declare function unsupportedAgentFlagsError(surface: string): string;
|
|
41
|
+
export declare function resolveAgent(input: ResolveAgentInput): ResolveAgentResult;
|
|
42
|
+
export declare function resolveCliAgent(rpc: KernelRpc, flags: CliAgentFlags): Promise<ResolveAgentResult>;
|
|
43
|
+
export declare function applyResolvedAgent(request: (method: string, params: unknown) => Promise<unknown>, agent: ResolvedAgent): Promise<void>;
|
|
44
|
+
//# sourceMappingURL=model-flags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-flags.d.ts","sourceRoot":"","sources":["../../src/launch/model-flags.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK9C,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,SAAS,aAAa,EAAE,CAAC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC5B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAE9D;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKlE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,kBAAkB,CAuEzE;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAYvG;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,EAC9D,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/** Same ceiling as scheme_repl inventory enumerate — do not dump OpenRouter. */
|
|
2
|
+
const MODEL_LIST_MAX = 12;
|
|
3
|
+
export function hasCliAgentFlags(flags) {
|
|
4
|
+
return nonempty(flags.connection) != null || nonempty(flags.model) != null;
|
|
5
|
+
}
|
|
6
|
+
export function unsupportedAgentFlagsError(surface) {
|
|
7
|
+
return [
|
|
8
|
+
`--model and --connection are only valid for a session (TUI, --continue, eval, -p, or a .scm program).`,
|
|
9
|
+
`\`${surface}\` does not select a model.`,
|
|
10
|
+
].join("\n");
|
|
11
|
+
}
|
|
12
|
+
export function resolveAgent(input) {
|
|
13
|
+
const wantedConnection = nonempty(input.flags.connection);
|
|
14
|
+
const wantedModel = nonempty(input.flags.model);
|
|
15
|
+
if (wantedConnection == null && wantedModel == null) {
|
|
16
|
+
return { ok: true, agent: { connection: "" } };
|
|
17
|
+
}
|
|
18
|
+
const completion = input.connections.filter((row) => row.abilityClaim.includes("completion"));
|
|
19
|
+
const enabledCompletion = completion.filter((row) => row.enabled);
|
|
20
|
+
if (wantedConnection != null) {
|
|
21
|
+
const row = input.connections.find((item) => item.id === wantedConnection);
|
|
22
|
+
if (row == null) {
|
|
23
|
+
return { ok: false, error: unknownConnectionError(wantedConnection, input.connections) };
|
|
24
|
+
}
|
|
25
|
+
if (!row.abilityClaim.includes("completion")) {
|
|
26
|
+
return {
|
|
27
|
+
ok: false,
|
|
28
|
+
error: [
|
|
29
|
+
`connection ${quote(wantedConnection)} is not a completion connection (${row.driver}).`,
|
|
30
|
+
completionLine(enabledCompletion),
|
|
31
|
+
].join("\n"),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
if (!row.enabled) {
|
|
35
|
+
return { ok: false, error: `connection ${quote(wantedConnection)} is disabled.` };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (wantedModel == null) {
|
|
39
|
+
return { ok: true, agent: { connection: wantedConnection } };
|
|
40
|
+
}
|
|
41
|
+
if (input.catalogs == null) {
|
|
42
|
+
return {
|
|
43
|
+
ok: true,
|
|
44
|
+
agent: wantedConnection == null
|
|
45
|
+
? { connection: "", model: wantedModel }
|
|
46
|
+
: { connection: wantedConnection, model: wantedModel },
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
const catalogs = input.catalogs;
|
|
50
|
+
if (wantedConnection != null) {
|
|
51
|
+
const catalog = catalogs.find((row) => row.id === wantedConnection);
|
|
52
|
+
if (catalog == null) {
|
|
53
|
+
return {
|
|
54
|
+
ok: false,
|
|
55
|
+
error: `connection ${quote(wantedConnection)} did not return a model catalog.`,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (!catalog.models.includes(wantedModel)) {
|
|
59
|
+
return { ok: false, error: missingOnConnectionError(wantedConnection, wantedModel, catalog) };
|
|
60
|
+
}
|
|
61
|
+
return { ok: true, agent: { connection: wantedConnection, model: wantedModel } };
|
|
62
|
+
}
|
|
63
|
+
const hits = catalogs.filter((row) => row.models.includes(wantedModel));
|
|
64
|
+
if (hits.length === 1) {
|
|
65
|
+
return { ok: true, agent: { connection: hits[0].id, model: wantedModel } };
|
|
66
|
+
}
|
|
67
|
+
if (hits.length > 1) {
|
|
68
|
+
const names = hits.map((row) => row.id).sort();
|
|
69
|
+
return {
|
|
70
|
+
ok: false,
|
|
71
|
+
error: [
|
|
72
|
+
`model ${quote(wantedModel)} is available on multiple connections: ${names.join(", ")}.`,
|
|
73
|
+
`Pass --connection to pick one.`,
|
|
74
|
+
].join("\n"),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return { ok: false, error: missingAcrossError(wantedModel, catalogs, enabledCompletion) };
|
|
78
|
+
}
|
|
79
|
+
export async function resolveCliAgent(rpc, flags) {
|
|
80
|
+
if (!hasCliAgentFlags(flags))
|
|
81
|
+
return { ok: true, agent: { connection: "" } };
|
|
82
|
+
const listed = await rpc.request("connect/list", {});
|
|
83
|
+
const connections = connectionRowsOf(listed);
|
|
84
|
+
const preview = resolveAgent({ flags, connections });
|
|
85
|
+
if (!preview.ok)
|
|
86
|
+
return preview;
|
|
87
|
+
if (nonempty(flags.model) == null)
|
|
88
|
+
return preview;
|
|
89
|
+
const wantedConnection = nonempty(flags.connection);
|
|
90
|
+
const catalogs = catalogRowsOf(await rpc.request("connect/models", wantedConnection == null ? {} : { id: wantedConnection }));
|
|
91
|
+
return resolveAgent({ flags, connections, catalogs });
|
|
92
|
+
}
|
|
93
|
+
export async function applyResolvedAgent(request, agent) {
|
|
94
|
+
const connection = nonempty(agent.connection);
|
|
95
|
+
const model = nonempty(agent.model);
|
|
96
|
+
if (connection == null && model == null)
|
|
97
|
+
return;
|
|
98
|
+
if (connection != null) {
|
|
99
|
+
await request("kv/set", { key: "connection", value: connection });
|
|
100
|
+
}
|
|
101
|
+
if (model != null) {
|
|
102
|
+
await request("kv/set", { key: "model", value: model });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function connectionRowsOf(payload) {
|
|
106
|
+
if (payload == null || typeof payload !== "object" || !("connections" in payload))
|
|
107
|
+
return [];
|
|
108
|
+
const raw = payload.connections;
|
|
109
|
+
if (!Array.isArray(raw))
|
|
110
|
+
return [];
|
|
111
|
+
return raw.flatMap((row) => {
|
|
112
|
+
if (row == null || typeof row !== "object")
|
|
113
|
+
return [];
|
|
114
|
+
const rec = row;
|
|
115
|
+
const id = typeof rec.id === "string" ? rec.id : "";
|
|
116
|
+
if (id === "")
|
|
117
|
+
return [];
|
|
118
|
+
const can = Array.isArray(rec.abilityClaim) ? rec.abilityClaim.map(String) : [];
|
|
119
|
+
return [
|
|
120
|
+
{
|
|
121
|
+
id,
|
|
122
|
+
name: typeof rec.name === "string" ? rec.name : id,
|
|
123
|
+
driver: typeof rec.driver === "string" ? rec.driver : "",
|
|
124
|
+
abilityClaim: can,
|
|
125
|
+
enabled: rec.enabled !== false,
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
function catalogRowsOf(payload) {
|
|
131
|
+
if (payload == null || typeof payload !== "object" || !("connections" in payload))
|
|
132
|
+
return [];
|
|
133
|
+
const raw = payload.connections;
|
|
134
|
+
if (!Array.isArray(raw))
|
|
135
|
+
return [];
|
|
136
|
+
return raw.flatMap((row) => {
|
|
137
|
+
if (row == null || typeof row !== "object")
|
|
138
|
+
return [];
|
|
139
|
+
const rec = row;
|
|
140
|
+
const id = typeof rec.id === "string" ? rec.id : "";
|
|
141
|
+
if (id === "")
|
|
142
|
+
return [];
|
|
143
|
+
return [
|
|
144
|
+
{
|
|
145
|
+
id,
|
|
146
|
+
models: Array.isArray(rec.models) ? rec.models.map(String) : [],
|
|
147
|
+
error: typeof rec.error === "string" ? rec.error : "",
|
|
148
|
+
},
|
|
149
|
+
];
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
function unknownConnectionError(id, connections) {
|
|
153
|
+
const completion = connections.filter((row) => row.abilityClaim.includes("completion") && row.enabled);
|
|
154
|
+
const mcp = connections.filter((row) => row.abilityClaim.includes("mcp") && !row.abilityClaim.includes("completion") && row.enabled);
|
|
155
|
+
const lines = [`unknown connection ${quote(id)}.`];
|
|
156
|
+
if (connections.length === 0) {
|
|
157
|
+
lines.push("No connections are configured.");
|
|
158
|
+
return lines.join("\n");
|
|
159
|
+
}
|
|
160
|
+
lines.push(completionLine(completion));
|
|
161
|
+
if (mcp.length > 0) {
|
|
162
|
+
lines.push(`MCP connections: ${ids(mcp)}.`);
|
|
163
|
+
}
|
|
164
|
+
return lines.join("\n");
|
|
165
|
+
}
|
|
166
|
+
function missingOnConnectionError(connection, model, catalog) {
|
|
167
|
+
const lines = [`model ${quote(model)} is not available on connection ${quote(connection)}.`];
|
|
168
|
+
if (catalog.models.length === 0) {
|
|
169
|
+
const status = catalog.error.trim() === "" ? "no models loaded" : catalog.error.trim();
|
|
170
|
+
lines.push(`Connection ${quote(connection)} has no models (${status}).`);
|
|
171
|
+
return lines.join("\n");
|
|
172
|
+
}
|
|
173
|
+
lines.push(`Models on ${connection}: ${formatModels(catalog.models)}.`);
|
|
174
|
+
return lines.join("\n");
|
|
175
|
+
}
|
|
176
|
+
function missingAcrossError(model, catalogs, completion) {
|
|
177
|
+
const lines = [`model ${quote(model)} was not found on any completion connection.`];
|
|
178
|
+
if (catalogs.length === 0) {
|
|
179
|
+
lines.push(completionLine(completion));
|
|
180
|
+
return lines.join("\n");
|
|
181
|
+
}
|
|
182
|
+
const searched = catalogs.map((row) => {
|
|
183
|
+
const models = row.models.length === 0 ? emptyCatalogNote(row) : formatModels(row.models);
|
|
184
|
+
return `${row.id} (${models})`;
|
|
185
|
+
});
|
|
186
|
+
lines.push(`Searched: ${searched.join("; ")}.`);
|
|
187
|
+
return lines.join("\n");
|
|
188
|
+
}
|
|
189
|
+
function emptyCatalogNote(row) {
|
|
190
|
+
return row.error.trim() === "" ? "no models loaded" : row.error.trim();
|
|
191
|
+
}
|
|
192
|
+
function completionLine(rows) {
|
|
193
|
+
if (rows.length === 0)
|
|
194
|
+
return "No completion connections are configured.";
|
|
195
|
+
return `Completion connections: ${ids(rows)}.`;
|
|
196
|
+
}
|
|
197
|
+
function formatModels(models) {
|
|
198
|
+
if (models.length <= MODEL_LIST_MAX)
|
|
199
|
+
return models.join(", ");
|
|
200
|
+
const shown = models.slice(0, MODEL_LIST_MAX);
|
|
201
|
+
return `${shown.join(", ")}, and ${models.length - shown.length} more`;
|
|
202
|
+
}
|
|
203
|
+
function ids(rows) {
|
|
204
|
+
return [...rows]
|
|
205
|
+
.map((row) => row.id)
|
|
206
|
+
.sort()
|
|
207
|
+
.join(", ");
|
|
208
|
+
}
|
|
209
|
+
function nonempty(value) {
|
|
210
|
+
const trimmed = value?.trim() ?? "";
|
|
211
|
+
return trimmed === "" ? undefined : trimmed;
|
|
212
|
+
}
|
|
213
|
+
function quote(value) {
|
|
214
|
+
return JSON.stringify(value);
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=model-flags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-flags.js","sourceRoot":"","sources":["../../src/launch/model-flags.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a shell takes from its host: the process streams, plus the working
|
|
3
|
+
* directory when the caller is not the process (tests, embedders).
|
|
4
|
+
*/
|
|
5
|
+
export type Streams = {
|
|
6
|
+
readonly stdin: NodeJS.ReadStream;
|
|
7
|
+
readonly stdout: NodeJS.WriteStream;
|
|
8
|
+
readonly stderr: NodeJS.WriteStream;
|
|
9
|
+
readonly cwd?: string;
|
|
10
|
+
};
|
|
11
|
+
/** `Streams` plus the one-line error sink a shell reports through. Carries no command-parser types. */
|
|
12
|
+
export type ShellStreams = Streams & {
|
|
13
|
+
readonly writeErr: (error: unknown) => void;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=streams.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streams.d.ts","sourceRoot":"","sources":["../../src/launch/streams.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;IACpC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,uGAAuG;AACvG,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streams.js","sourceRoot":"","sources":["../../src/launch/streams.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tab→session cookie. `scope !== ""` is not a continue target (workers).
|
|
3
|
+
*/
|
|
4
|
+
import type { SessionRoot } from "@inhuman.tools/harness-model";
|
|
5
|
+
import { type EnvBag } from "./term-session-key.js";
|
|
6
|
+
export type KernelRequest = (method: string, params?: unknown) => Promise<unknown>;
|
|
7
|
+
export declare function termContinuePayload(env: EnvBag, session: Pick<SessionRoot, "sessionId" | "agent">): {
|
|
8
|
+
key: string;
|
|
9
|
+
sessionId: string;
|
|
10
|
+
} | null;
|
|
11
|
+
export declare function stampTermContinue(request: KernelRequest, env: EnvBag, session: Pick<SessionRoot, "sessionId" | "agent">): Promise<void>;
|
|
12
|
+
export declare function clearTermContinue(request: KernelRequest, key: string): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=term-continue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"term-continue.d.ts","sourceRoot":"","sources":["../../src/launch/term-continue.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE,OAAO,EAAkB,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpE,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEnF,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,GAChD;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAI3C;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,GAChD,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1F"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { termSessionKey } from "./term-session-key.js";
|
|
2
|
+
export function termContinuePayload(env, session) {
|
|
3
|
+
const key = termSessionKey(env);
|
|
4
|
+
if (key == null || session.agent.spec.recipeScope !== "")
|
|
5
|
+
return null;
|
|
6
|
+
return { key, sessionId: session.sessionId };
|
|
7
|
+
}
|
|
8
|
+
export async function stampTermContinue(request, env, session) {
|
|
9
|
+
const payload = termContinuePayload(env, session);
|
|
10
|
+
if (payload == null)
|
|
11
|
+
return;
|
|
12
|
+
await request("term-continue/set", payload);
|
|
13
|
+
}
|
|
14
|
+
export async function clearTermContinue(request, key) {
|
|
15
|
+
await request("term-continue/clear", { key });
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=term-continue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"term-continue.js","sourceRoot":"","sources":["../../src/launch/term-continue.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAe,MAAM,uBAAuB,CAAC;AAIpE,MAAM,UAAU,mBAAmB,CACjC,GAAW,EACX,OAAiD;IAEjD,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACtE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAsB,EACtB,GAAW,EACX,OAAiD;IAEjD,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAClD,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO;IAC5B,MAAM,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAsB,EAAE,GAAW;IACzE,MAAM,OAAO,CAAC,qBAAqB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tab/pane identity for `--continue`. Null if the process has no emulator
|
|
3
|
+
* cookie and no mux pane — miss is mint. Outer TERM_SESSION_ID is not
|
|
4
|
+
* identity under tmux: mix every live mux token.
|
|
5
|
+
*/
|
|
6
|
+
export type EnvBag = Record<string, string | undefined>;
|
|
7
|
+
export declare function termSessionKey(env: EnvBag): string | null;
|
|
8
|
+
//# sourceMappingURL=term-session-key.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"term-session-key.d.ts","sourceRoot":"","sources":["../../src/launch/term-session-key.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAExD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBzD"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tab/pane identity for `--continue`. Null if the process has no emulator
|
|
3
|
+
* cookie and no mux pane — miss is mint. Outer TERM_SESSION_ID is not
|
|
4
|
+
* identity under tmux: mix every live mux token.
|
|
5
|
+
*/
|
|
6
|
+
export function termSessionKey(env) {
|
|
7
|
+
const parts = [];
|
|
8
|
+
const emu = emulatorCookie(env);
|
|
9
|
+
if (emu != null)
|
|
10
|
+
parts.push(`emu=${emu}`);
|
|
11
|
+
const tmux = tmuxFields(env);
|
|
12
|
+
if (tmux != null) {
|
|
13
|
+
parts.push(`tmux_sock=${tmux.socket}`, `tmux_pid=${tmux.pid}`, `tmux_pane=${tmux.pane}`);
|
|
14
|
+
}
|
|
15
|
+
if (env.ZELLIJ_PANE_ID != null && env.ZELLIJ_PANE_ID !== "") {
|
|
16
|
+
parts.push(`zellij_pane=${env.ZELLIJ_PANE_ID}`);
|
|
17
|
+
if (env.ZELLIJ_SESSION_NAME)
|
|
18
|
+
parts.push(`zellij_session=${env.ZELLIJ_SESSION_NAME}`);
|
|
19
|
+
if (env.ZELLIJ_SOCKET_DIR)
|
|
20
|
+
parts.push(`zellij_sock=${env.ZELLIJ_SOCKET_DIR}`);
|
|
21
|
+
}
|
|
22
|
+
if (env.STY != null && env.STY !== "") {
|
|
23
|
+
parts.push(`screen=${env.STY}`, `screen_win=${env.WINDOW === undefined || env.WINDOW === "" ? "0" : env.WINDOW}`);
|
|
24
|
+
}
|
|
25
|
+
return parts.length === 0 ? null : parts.join(";");
|
|
26
|
+
}
|
|
27
|
+
function emulatorCookie(env) {
|
|
28
|
+
const term = trim(env.TERM_SESSION_ID);
|
|
29
|
+
if (term != null) {
|
|
30
|
+
const colon = term.lastIndexOf(":");
|
|
31
|
+
return colon === -1 ? term : term.slice(colon + 1);
|
|
32
|
+
}
|
|
33
|
+
const wt = trim(env.WT_SESSION);
|
|
34
|
+
if (wt != null)
|
|
35
|
+
return wt;
|
|
36
|
+
const wezPane = trim(env.WEZTERM_PANE);
|
|
37
|
+
const wezSock = trim(env.WEZTERM_UNIX_SOCKET);
|
|
38
|
+
if (wezPane != null && wezSock != null)
|
|
39
|
+
return `wez:${wezSock}:${wezPane}`;
|
|
40
|
+
const kittyWin = trim(env.KITTY_WINDOW_ID);
|
|
41
|
+
const kittyPid = trim(env.KITTY_PID);
|
|
42
|
+
if (kittyWin != null && kittyPid != null)
|
|
43
|
+
return `kitty:${kittyPid}:${kittyWin}`;
|
|
44
|
+
const konsole = trim(env.SHELL_SESSION_ID);
|
|
45
|
+
if (konsole != null)
|
|
46
|
+
return konsole;
|
|
47
|
+
const gnome = trim(env.GNOME_TERMINAL_SCREEN);
|
|
48
|
+
if (gnome != null)
|
|
49
|
+
return gnome;
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
function tmuxFields(env) {
|
|
53
|
+
const raw = trim(env.TMUX);
|
|
54
|
+
const pane = trim(env.TMUX_PANE);
|
|
55
|
+
if (raw == null || pane == null)
|
|
56
|
+
return null;
|
|
57
|
+
const last = raw.lastIndexOf(",");
|
|
58
|
+
if (last <= 0)
|
|
59
|
+
return null;
|
|
60
|
+
const rest = raw.slice(0, last);
|
|
61
|
+
const mid = rest.lastIndexOf(",");
|
|
62
|
+
if (mid <= 0)
|
|
63
|
+
return null;
|
|
64
|
+
const socket = rest.slice(0, mid);
|
|
65
|
+
const pid = rest.slice(mid + 1);
|
|
66
|
+
if (socket === "" || pid === "")
|
|
67
|
+
return null;
|
|
68
|
+
return { socket, pid, pane };
|
|
69
|
+
}
|
|
70
|
+
function trim(value) {
|
|
71
|
+
if (value == null)
|
|
72
|
+
return null;
|
|
73
|
+
const next = value.trim();
|
|
74
|
+
return next === "" ? null : next;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=term-session-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"term-session-key.js","sourceRoot":"","sources":["../../src/launch/term-session-key.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare class ObservableAbortSignal extends AbortSignal {
|
|
2
|
+
static from(signal: AbortSignal): ObservableAbortSignal;
|
|
3
|
+
static abort(reason?: unknown): ObservableAbortSignal;
|
|
4
|
+
static timeout(milliseconds: number): ObservableAbortSignal;
|
|
5
|
+
static any(signals: AbortSignal[]): ObservableAbortSignal;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=observable-abort-signal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observable-abort-signal.d.ts","sourceRoot":"","sources":["../src/observable-abort-signal.ts"],"names":[],"mappings":"AA4CA,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,qBAAqB;WASvC,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,qBAAqB;WAI9C,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,qBAAqB;WAIpD,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,qBAAqB;CAGnE"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AbortSignal whose `aborted` and `reason` reads track in MobX.
|
|
3
|
+
* Native AbortSignal is an illegal constructor; instances come from
|
|
4
|
+
* AbortController / AbortSignal.abort|timeout|any, then {@link from}.
|
|
5
|
+
*/
|
|
6
|
+
import { action, createAtom } from "mobx";
|
|
7
|
+
const observed = new WeakSet();
|
|
8
|
+
const abortedDesc = Object.getOwnPropertyDescriptor(AbortSignal.prototype, "aborted");
|
|
9
|
+
const reasonDesc = Object.getOwnPropertyDescriptor(AbortSignal.prototype, "reason");
|
|
10
|
+
function observe(signal) {
|
|
11
|
+
if (abortedDesc?.get == null || reasonDesc?.get == null) {
|
|
12
|
+
throw new Error("AbortSignal.aborted/reason are not getters");
|
|
13
|
+
}
|
|
14
|
+
const atom = createAtom("AbortSignal");
|
|
15
|
+
const abortedGet = abortedDesc.get;
|
|
16
|
+
const reasonGet = reasonDesc.get;
|
|
17
|
+
Object.defineProperty(signal, "aborted", {
|
|
18
|
+
configurable: true,
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get() {
|
|
21
|
+
atom.reportObserved();
|
|
22
|
+
return abortedGet.call(signal);
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
Object.defineProperty(signal, "reason", {
|
|
26
|
+
configurable: true,
|
|
27
|
+
enumerable: false,
|
|
28
|
+
get() {
|
|
29
|
+
atom.reportObserved();
|
|
30
|
+
return reasonGet.call(signal);
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
if (!abortedGet.call(signal)) {
|
|
34
|
+
signal.addEventListener("abort", action("abort", () => atom.reportChanged()), { once: true });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export class ObservableAbortSignal extends AbortSignal {
|
|
38
|
+
static from(signal) {
|
|
39
|
+
if (!observed.has(signal)) {
|
|
40
|
+
observe(signal);
|
|
41
|
+
observed.add(signal);
|
|
42
|
+
}
|
|
43
|
+
Object.setPrototypeOf(signal, ObservableAbortSignal.prototype);
|
|
44
|
+
return signal;
|
|
45
|
+
}
|
|
46
|
+
static abort(reason) {
|
|
47
|
+
return ObservableAbortSignal.from(AbortSignal.abort(reason));
|
|
48
|
+
}
|
|
49
|
+
static timeout(milliseconds) {
|
|
50
|
+
return ObservableAbortSignal.from(AbortSignal.timeout(milliseconds));
|
|
51
|
+
}
|
|
52
|
+
static any(signals) {
|
|
53
|
+
return ObservableAbortSignal.from(AbortSignal.any(signals));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=observable-abort-signal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observable-abort-signal.js","sourceRoot":"","sources":["../src/observable-abort-signal.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAE1C,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAe,CAAC;AAE5C,MAAM,WAAW,GAAG,MAAM,CAAC,wBAAwB,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACtF,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAEpF,SAAS,OAAO,CAAC,MAAmB;IAClC,IAAI,WAAW,EAAE,GAAG,IAAI,IAAI,IAAI,UAAU,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC;IACnC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC;IACjC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE;QACvC,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,IAAI;QAChB,GAAG;YACD,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;KACF,CAAC,CAAC;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE;QACtC,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,KAAK;QACjB,GAAG;YACD,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;KACF,CAAC,CAAC;IACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,gBAAgB,CACrB,OAAO,EACP,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,EAC3C,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,OAAO,qBAAsB,SAAQ,WAAW;IACpD,MAAM,CAAC,IAAI,CAAC,MAAmB;QAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,MAAM,CAAC,CAAC;YAChB,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAC/D,OAAO,MAA+B,CAAC;IACzC,CAAC;IAED,MAAM,CAAU,KAAK,CAAC,MAAgB;QACpC,OAAO,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,CAAU,OAAO,CAAC,YAAoB;QAC1C,OAAO,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,CAAU,GAAG,CAAC,OAAsB;QACxC,OAAO,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-external.d.ts","sourceRoot":"","sources":["../src/open-external.ts"],"names":[],"mappings":"AAOA,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAcjD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fire-and-forget URL open. No display (SSH / container) is fine.
|
|
3
|
+
* WIN_START: cmd.exe `start "" url` — without the empty title the quoted
|
|
4
|
+
* URL becomes the window title and navigation is swallowed.
|
|
5
|
+
*/
|
|
6
|
+
import { spawn } from "node:child_process";
|
|
7
|
+
export function openExternalUrl(url) {
|
|
8
|
+
if (!/^https?:\/\//i.test(url.trim()))
|
|
9
|
+
return;
|
|
10
|
+
try {
|
|
11
|
+
const target = url.trim();
|
|
12
|
+
if (process.platform === "darwin") {
|
|
13
|
+
spawn("open", [target], { detached: true, stdio: "ignore" }).unref();
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (process.platform === "win32") {
|
|
17
|
+
spawn("cmd", ["/c", "start", "", target], { detached: true, stdio: "ignore" }).unref();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
spawn("xdg-open", [target], { detached: true, stdio: "ignore" }).unref();
|
|
21
|
+
}
|
|
22
|
+
catch { }
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=open-external.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-external.js","sourceRoot":"","sources":["../src/open-external.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAAE,OAAO;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YACrE,OAAO;QACT,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YACvF,OAAO;QACT,CAAC;QACD,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC"}
|