agent-yes 1.236.0 → 1.237.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/{JsonlStore-CWOA3aDH.js → JsonlStore-CPGIR0Wy.js} +1 -1
- package/dist/SUPPORTED_CLIS-C0RwjYrz.js +11 -0
- package/dist/{SUPPORTED_CLIS-C7bkkXue.js → SUPPORTED_CLIS-CDrJz9Xo.js} +2 -2
- package/dist/{agent-yes.config-BhjzWavn.js → agent-yes.config-DPtMM0S-.js} +2 -2
- package/dist/{agentShare-BxAaZ-UR.js → agentShare-Cl_J3dfx.js} +9 -9
- package/dist/{agentYesHome-CtHb5b71.js → agentYesHome-CtmsY6I-.js} +1 -1
- package/dist/browser-B3dOptjL.js +311 -0
- package/dist/browser-BRMyG4JA.js +13514 -0
- package/dist/callback-CFbkvqTh.js +12 -0
- package/dist/{callback-B1AWp2tC.js → callback-D0_AeyN1.js} +6 -6
- package/dist/{callbackCore-CcbVa8r2.js → callbackCore-CvmGSvrj.js} +1 -1
- package/dist/{callbackCore-Me97qn68.js → callbackCore-DAYcemCC.js} +1 -1
- package/dist/{channels-Lsot9pyU.js → channels-BiGUYTuz.js} +2 -2
- package/dist/{channels-DHXLnU4r.js → channels-CMNMFJlY.js} +6 -6
- package/dist/channels.js +6 -310
- package/dist/chunk-cZBX9HZv.js +20 -0
- package/dist/cli.js +11 -11
- package/dist/{configShared-BXz2vi4Q.js → configShared-9wVlbPyC.js} +1 -1
- package/dist/{cwdConflictWarn-ArYYtOGy.js → cwdConflictWarn-DWHWlBxS.js} +2 -2
- package/dist/{cwdDeprecation-BGX20-Fe.js → cwdDeprecation-Cd8Ykm2t.js} +1 -1
- package/dist/{e2e-CYlKpfxa.js → e2e-CEIdJGZ7.js} +1 -1
- package/dist/{expose-ByT4ef7C.js → expose-DROTwbyU.js} +1 -1
- package/dist/{forkNested-Bai0Q7BL.js → forkNested-DqPisz9d.js} +2 -2
- package/dist/{globalPidIndex-Ca4sTr1b.js → globalPidIndex-D9DOSd-c.js} +1 -1
- package/dist/index.js +7 -7
- package/dist/{messageLog-zVGWLX7w.js → messageLog-C-YIzhRj.js} +1 -1
- package/dist/{nodeRuntime-fVRbz6w6.js → nodeRuntime-Bf88NPqj.js} +2 -2
- package/dist/{notifyDaemon-Cxb0-5a0.js → notifyDaemon-D_8TRVHt.js} +8 -8
- package/dist/{openBrowser-DL-EO8Hi.js → openBrowser-ChLcPELv.js} +1 -1
- package/dist/{peer-68ZwnxLs.js → peer-B5JKF4BP.js} +3 -3
- package/dist/peer-D5lr1Afv.js +4 -0
- package/dist/{pidStore-Hjba3K6Q.js → pidStore-6EZd5DUv.js} +4 -4
- package/dist/pidStore-bCVS2Ldt.js +6 -0
- package/dist/{reaper-iQXyufgp.js → reaper-DP49VCKx.js} +2 -2
- package/dist/{reaper-pJpMYKmj.js → reaper-IhkB_RO0.js} +1 -1
- package/dist/{remotes-CF1LJLxY.js → remotes-BClMgQZW.js} +3 -3
- package/dist/{remotes-BDdfhL6N.js → remotes-Bem6WIyU.js} +3 -3
- package/dist/{runningLock-BFk3Mo8K.js → runningLock-DBoONoM-.js} +1 -1
- package/dist/{rustBinary-CFSG7it2.js → rustBinary-Bb9qJZ5w.js} +2 -2
- package/dist/{schedule-CXHdiUHa.js → schedule-B8Erb3y6.js} +11 -11
- package/dist/{serve-DEEwIlVV.js → serve-QejbNTr-.js} +187 -43
- package/dist/{setup-QfDtv5tw.js → setup-Dzi5Cc3g.js} +3 -3
- package/dist/{share-CDER9qNq.js → share--aHaPSjt.js} +2 -2
- package/dist/{share-D4K0JnHg.js → share-B9u8-I3y.js} +2 -2
- package/dist/{spawnGate-PwzImpOw.js → spawnGate-Bo_LFgt9.js} +3 -3
- package/dist/spawnGate-CuWCd2im.js +5 -0
- package/dist/{store-BXJERNbW.js → store-Ck0XRn-K.js} +1 -1
- package/dist/{subcommands-_Ci82sb1.js → subcommands-DFr-5FOL.js} +26 -21
- package/dist/{subcommands-m2DRpvHt.js → subcommands-ymJWO2iv.js} +7 -7
- package/dist/terminal-vNeFNLT8.js +138 -0
- package/dist/terminal.js +3 -0
- package/dist/{todoAutomation-x6guaQXc.js → todoAutomation-Buo457VO.js} +2 -2
- package/dist/{todoCli-CAMVVz9u.js → todoCli-CNNR9Czu.js} +4 -4
- package/dist/{tray-CF8xRQqt.js → tray-D5qFaqlS.js} +2 -2
- package/dist/{ts-D1FDmhc-.js → ts-Dd1FK7sR.js} +11 -28
- package/dist/{versionChecker-DJEtU1JU.js → versionChecker-XfEBINhH.js} +2 -2
- package/dist/{webrtcLink-CEYNs0pt.js → webrtcLink-VQhWmKOw.js} +2 -2
- package/dist/{webrtcRemote-CNC_bMH6.js → webrtcRemote-DJDtCTpj.js} +3 -3
- package/dist/widgets.js +7 -0
- package/dist/{workspaceConfig-CuGjX2_R.js → workspaceConfig-B7HaQ-MI.js} +2 -2
- package/dist/{ws-C7B4xWQl.js → ws-Dun8gGiV.js} +9 -9
- package/package.json +13 -1
- package/ts/serve.ts +144 -5
- package/ts/subcommands.ts +6 -0
- package/ts/termToken.spec.ts +44 -0
- package/ts/termToken.ts +85 -0
- package/ts/terminal/browser.ts +607 -0
- package/ts/terminal.spec.ts +50 -0
- package/ts/terminal.ts +245 -0
- package/ts/widgets.ts +14 -0
- package/dist/SUPPORTED_CLIS-BDXbzEWF.js +0 -11
- package/dist/callback-Dtk0wMsl.js +0 -12
- package/dist/peer-CX4qQx5U.js +0 -4
- package/dist/pidStore-Cp3HekUh.js +0 -6
- package/dist/spawnGate-C21TL4f2.js +0 -5
package/ts/terminal.ts
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
// `ay term` — embed a LIVE, read-only agent-session terminal in any web page.
|
|
2
|
+
//
|
|
3
|
+
// The terminal sibling of `ay ch`. `ay term embed <pid>` prints a <script> that
|
|
4
|
+
// loads the AyTerminal widget (terminal/browser.ts) and renders a read-only
|
|
5
|
+
// xterm mirror of the agent's PTY, streamed from the serving `ay serve` daemon's
|
|
6
|
+
// `/api/tail/<pid>?raw=1` SSE endpoint.
|
|
7
|
+
//
|
|
8
|
+
// PHASE 1 = SAME-ORIGIN. `/api/tail` is token-gated and emits no CORS headers, so
|
|
9
|
+
// the embedding page must be served same-origin with the daemon (`ay serve --http`),
|
|
10
|
+
// or the token/origin must be provided AND the daemon reachable. Cross-origin
|
|
11
|
+
// arbitrary pages (via the WebRTC `--share` transport) are a later phase.
|
|
12
|
+
|
|
13
|
+
type FlagSpec = Record<string, "bool" | "value">;
|
|
14
|
+
|
|
15
|
+
function parseFlags(
|
|
16
|
+
args: string[],
|
|
17
|
+
known: FlagSpec,
|
|
18
|
+
): { flags: Record<string, string | boolean>; positional: string[] } {
|
|
19
|
+
const flags: Record<string, string | boolean> = {};
|
|
20
|
+
const positional: string[] = [];
|
|
21
|
+
for (let i = 0; i < args.length; i++) {
|
|
22
|
+
const a = args[i]!;
|
|
23
|
+
if (!a.startsWith("-") || a === "-") {
|
|
24
|
+
positional.push(a);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
const eq = a.indexOf("=");
|
|
28
|
+
const name = eq === -1 ? a.replace(/^--?/, "") : a.slice(a.startsWith("--") ? 2 : 1, eq);
|
|
29
|
+
const kind = known[name];
|
|
30
|
+
if (!kind) throw new Error(`unknown flag ${a}`);
|
|
31
|
+
if (kind === "bool") {
|
|
32
|
+
if (eq !== -1) throw new Error(`--${name} takes no value`);
|
|
33
|
+
flags[name] = true;
|
|
34
|
+
} else {
|
|
35
|
+
const v = eq !== -1 ? a.slice(eq + 1) : args[++i];
|
|
36
|
+
if (v === undefined) throw new Error(`${a} requires a value`);
|
|
37
|
+
flags[name] = v;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return { flags, positional };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface TermEmbedOpts {
|
|
44
|
+
origin?: string;
|
|
45
|
+
/** Wire keyboard input to the agent (opt-in). Needs a token that grants /api/send for this pid. */
|
|
46
|
+
interactive?: boolean;
|
|
47
|
+
}
|
|
48
|
+
export type TermEmbedMode =
|
|
49
|
+
| ({ kind: "discover" } & TermEmbedOpts) // no token in the file — widget reads it from the page
|
|
50
|
+
| ({ kind: "placeholder" } & TermEmbedOpts) // window.AY_TERM_TOKEN injected at runtime
|
|
51
|
+
| ({ kind: "live"; token: string } & TermEmbedOpts); // token baked into the file
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The embed `<script>` snippet — a script (NOT an iframe) that loads the AyTerminal
|
|
55
|
+
* browser lib and mounts a read-only terminal in the page. Three modes trade off
|
|
56
|
+
* where the serve token lives: never in the file (`discover` — the safe default,
|
|
57
|
+
* the widget reads #k= / window.AY_TERM_TOKEN / localStorage), injected at runtime
|
|
58
|
+
* (`placeholder`), or baked in (`live`, loud warning — a serve token is full-fleet
|
|
59
|
+
* read+write until scoped read-only tokens land).
|
|
60
|
+
*/
|
|
61
|
+
export function buildTermEmbedSnippet(host: string, pid: string, mode: TermEmbedMode): string {
|
|
62
|
+
const imp = ` import AyTerminal from "https://${host}/w/terminal.js";\n`;
|
|
63
|
+
const originArg = mode.origin ? `origin: ${JSON.stringify(mode.origin)}, ` : "";
|
|
64
|
+
// interactive is opt-in; the widget only wires the keyboard when readOnly:false
|
|
65
|
+
// AND the token actually grants /api/send (a 403 reverts it to a mirror).
|
|
66
|
+
const roArg = mode.interactive ? `readOnly: false, ` : "";
|
|
67
|
+
const tokenArg =
|
|
68
|
+
mode.kind === "live"
|
|
69
|
+
? `token: ${JSON.stringify(mode.token)}, `
|
|
70
|
+
: mode.kind === "placeholder"
|
|
71
|
+
? `token: window.AY_TERM_TOKEN, `
|
|
72
|
+
: "";
|
|
73
|
+
// mount into <div id="ay-term">…</div> if the page has one, else float in the corner
|
|
74
|
+
const tail = `.mount(document.getElementById("ay-term") ?? undefined);`;
|
|
75
|
+
const hint =
|
|
76
|
+
`Add <div id="ay-term" style="width:720px;height:420px"></div> where you want the ` +
|
|
77
|
+
`terminal, or omit it to float in the corner.`;
|
|
78
|
+
const kindLabel = mode.interactive ? "interactive" : "read-only";
|
|
79
|
+
const tokenNote =
|
|
80
|
+
mode.kind === "live"
|
|
81
|
+
? `this snippet embeds a LIVE token — do NOT commit it to a public or deploy-bound file.`
|
|
82
|
+
: mode.kind === "placeholder"
|
|
83
|
+
? `set window.AY_TERM_TOKEN at runtime; do NOT commit it.`
|
|
84
|
+
: `no token in this file; the widget reads it from the page (#k= / window.AY_TERM_TOKEN / localStorage).`;
|
|
85
|
+
return (
|
|
86
|
+
`<!-- ay terminal: ${kindLabel} view of #${pid} — ${tokenNote} ${hint} -->\n` +
|
|
87
|
+
`<script type="module">\n${imp}` +
|
|
88
|
+
` new AyTerminal({ ${originArg}${roArg}${tokenArg}pid: ${JSON.stringify(pid)} })${tail}\n` +
|
|
89
|
+
`</script>\n`
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function cmdTermEmbed(args: string[]): number {
|
|
94
|
+
const { flags, positional } = parseFlags(args, {
|
|
95
|
+
host: "value",
|
|
96
|
+
origin: "value",
|
|
97
|
+
token: "value",
|
|
98
|
+
placeholder: "bool",
|
|
99
|
+
interactive: "bool",
|
|
100
|
+
});
|
|
101
|
+
const pid = positional[0];
|
|
102
|
+
if (!pid || positional.length > 1)
|
|
103
|
+
throw new Error(
|
|
104
|
+
"usage: ay term embed <pid|keyword> [--host H] [--origin URL] [--token TOK | --placeholder] [--interactive]",
|
|
105
|
+
);
|
|
106
|
+
if (flags.token && flags.placeholder)
|
|
107
|
+
throw new Error("--token and --placeholder are mutually exclusive");
|
|
108
|
+
const host = typeof flags.host === "string" ? flags.host : "agent-yes.com";
|
|
109
|
+
const origin = typeof flags.origin === "string" ? flags.origin : undefined;
|
|
110
|
+
const interactive = flags.interactive === true;
|
|
111
|
+
const mode: TermEmbedMode = flags.placeholder
|
|
112
|
+
? { kind: "placeholder", origin, interactive }
|
|
113
|
+
: typeof flags.token === "string"
|
|
114
|
+
? { kind: "live", token: flags.token, origin, interactive }
|
|
115
|
+
: { kind: "discover", origin, interactive };
|
|
116
|
+
|
|
117
|
+
// stdout: only the snippet (safe to pipe/paste). stderr: the guidance.
|
|
118
|
+
process.stdout.write(buildTermEmbedSnippet(host, pid, mode));
|
|
119
|
+
|
|
120
|
+
if (mode.kind === "discover") {
|
|
121
|
+
process.stderr.write(
|
|
122
|
+
`\n Token-free snippet — the widget reads the serve token from the page (#k= hash,\n` +
|
|
123
|
+
` window.AY_TERM_TOKEN, or the console's localStorage["ay.localToken"]). Ideal when the\n` +
|
|
124
|
+
` page is served by the daemon itself (ay serve --http) with a #k=<token> link.\n`,
|
|
125
|
+
);
|
|
126
|
+
} else if (mode.kind === "placeholder") {
|
|
127
|
+
process.stderr.write(
|
|
128
|
+
`\n Placeholder — the token is NOT in the snippet; set window.AY_TERM_TOKEN at runtime\n` +
|
|
129
|
+
` (server-rendered / env), so a committed file carries no secret.\n`,
|
|
130
|
+
);
|
|
131
|
+
} else {
|
|
132
|
+
process.stderr.write(
|
|
133
|
+
`\n ⚠ This snippet embeds a LIVE serve token — full-fleet READ+WRITE for this daemon.\n` +
|
|
134
|
+
` Anyone who reads the page source gets it. Do NOT commit it to a public or\n` +
|
|
135
|
+
` deploy-bound file. Prefer --placeholder (runtime-injected) or the token-free\n` +
|
|
136
|
+
` default. Scoped read-only embed tokens are future work (need per-author signing).\n`,
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
if (interactive) {
|
|
140
|
+
process.stderr.write(
|
|
141
|
+
`\n ⚠ INTERACTIVE: keystrokes in the widget go to the agent's stdin. This needs a token\n` +
|
|
142
|
+
` that grants /api/send for #${pid} (the widget reverts to read-only on a 403). Prefer a\n` +
|
|
143
|
+
` scoped, short-TTL, single-session interactive token (future: ay term mint --interactive)\n` +
|
|
144
|
+
` over the master token — the master token is full-fleet RCE.\n`,
|
|
145
|
+
);
|
|
146
|
+
} else {
|
|
147
|
+
process.stderr.write(
|
|
148
|
+
`\n Read-only mirror: it renders the agent's PTY but never types into it. Add --interactive\n` +
|
|
149
|
+
` (with a send-granting token) to let viewers type to the agent.\n`,
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
process.stderr.write(` terminal.js must load from https://${host}/w/terminal.js.\n`);
|
|
153
|
+
if (!origin) {
|
|
154
|
+
process.stderr.write(
|
|
155
|
+
` Same-origin: /api/tail sends no CORS headers, so the page must be served by the\n` +
|
|
156
|
+
` daemon (ay serve --http). For an arbitrary-origin page, pass --origin <daemon-url>\n` +
|
|
157
|
+
` (the daemon must be reachable + allow it); the WebRTC --share transport for any\n` +
|
|
158
|
+
` origin is a later phase.\n`,
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
return 0;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** Parse a TTL like "900", "30s", "15m", "2h" → seconds. */
|
|
165
|
+
function parseTtlSec(s: string): number {
|
|
166
|
+
const m = /^(\d+)(s|m|h)?$/.exec(s.trim());
|
|
167
|
+
if (!m) throw new Error(`bad --ttl "${s}" (use e.g. 900, 30s, 15m, 2h)`);
|
|
168
|
+
const mult = m[2] === "h" ? 3600 : m[2] === "m" ? 60 : 1;
|
|
169
|
+
return Number(m[1]) * mult;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
async function cmdTermMint(args: string[]): Promise<number> {
|
|
173
|
+
const { flags, positional } = parseFlags(args, {
|
|
174
|
+
ttl: "value",
|
|
175
|
+
ro: "bool",
|
|
176
|
+
interactive: "bool",
|
|
177
|
+
json: "bool",
|
|
178
|
+
});
|
|
179
|
+
const pid = positional[0];
|
|
180
|
+
if (!pid || positional.length > 1)
|
|
181
|
+
throw new Error("usage: ay term mint <pid|keyword> [--ttl 15m] [--ro | --interactive] [--json]");
|
|
182
|
+
if (flags.ro && flags.interactive)
|
|
183
|
+
throw new Error("--ro and --interactive are mutually exclusive");
|
|
184
|
+
const ttlSec = parseTtlSec(typeof flags.ttl === "string" ? flags.ttl : "15m");
|
|
185
|
+
const canSend = flags.interactive === true; // default read-only
|
|
186
|
+
// Sign locally off ~/.agent-yes/.serve-token — no daemon round-trip.
|
|
187
|
+
const { mintScopedTermToken } = await import("./serve.ts");
|
|
188
|
+
const r = await mintScopedTermToken(pid, { ttlSec, canSend });
|
|
189
|
+
if (flags.json === true) {
|
|
190
|
+
process.stdout.write(JSON.stringify(r) + "\n");
|
|
191
|
+
return 0;
|
|
192
|
+
}
|
|
193
|
+
process.stdout.write(r.token + "\n");
|
|
194
|
+
const mins = Math.round(ttlSec / 60);
|
|
195
|
+
process.stderr.write(
|
|
196
|
+
`\n Scoped ${canSend ? "INTERACTIVE (read+write)" : "read-only"} token for #${r.pid}, ` +
|
|
197
|
+
`expires in ~${mins}m (${new Date(r.exp * 1000).toISOString()}).\n` +
|
|
198
|
+
` It grants ONLY ${canSend ? "read+write of" : "read of"} #${r.pid} — no other agent, no spawn.\n` +
|
|
199
|
+
` Safe to embed in a page (this is NOT the master token):\n` +
|
|
200
|
+
` ay term embed ${r.pid} --token <token> ${canSend ? "--interactive " : ""}--origin <daemon-url>\n` +
|
|
201
|
+
` Short TTL is the backstop (serverless — no central revoke); re-mint when it lapses.\n`,
|
|
202
|
+
);
|
|
203
|
+
return 0;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function termHelp(): number {
|
|
207
|
+
process.stdout.write(
|
|
208
|
+
`ay term — embed a live, read-only agent terminal in a web page\n\n` +
|
|
209
|
+
`Usage:\n` +
|
|
210
|
+
` ay term embed <pid|keyword> [--host H] [--origin URL] [--token TOK | --placeholder] [--interactive]\n` +
|
|
211
|
+
` ay term mint <pid|keyword> [--ttl 15m] [--ro | --interactive] [--json]\n\n` +
|
|
212
|
+
` embed print a <script> snippet that mounts a read-only xterm mirror of the agent\n` +
|
|
213
|
+
` into <div id="ay-term">, or a floating panel if that div is absent.\n` +
|
|
214
|
+
` mint mint a scoped, short-TTL token bound to ONE agent (read-only by default;\n` +
|
|
215
|
+
` --interactive also grants that agent's stdin) — safe to embed in a page,\n` +
|
|
216
|
+
` unlike the master serve token. Prints the token on stdout.\n\n` +
|
|
217
|
+
`Flags (embed):\n` +
|
|
218
|
+
` --host H CDN host serving terminal.js (default agent-yes.com)\n` +
|
|
219
|
+
` --origin URL daemon origin if the page is NOT served by the daemon (same-origin default)\n` +
|
|
220
|
+
` --token TOK bake a LIVE serve token into the snippet (⚠ full-fleet r/w; avoid committing)\n` +
|
|
221
|
+
` --placeholder read the token from window.AY_TERM_TOKEN at runtime (no secret in the file)\n` +
|
|
222
|
+
` --interactive wire the keyboard to the agent's stdin (needs a send-granting token; ⚠ opt-in)\n`,
|
|
223
|
+
);
|
|
224
|
+
return 0;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
export async function cmdTerm(args: string[]): Promise<number> {
|
|
228
|
+
const sub = args[0];
|
|
229
|
+
const rest = args.slice(1);
|
|
230
|
+
switch (sub) {
|
|
231
|
+
case "embed":
|
|
232
|
+
return cmdTermEmbed(rest);
|
|
233
|
+
case "mint":
|
|
234
|
+
return cmdTermMint(rest);
|
|
235
|
+
case undefined:
|
|
236
|
+
case "help":
|
|
237
|
+
case "--help":
|
|
238
|
+
case "-h":
|
|
239
|
+
return termHelp();
|
|
240
|
+
default:
|
|
241
|
+
process.stderr.write(`ay term: unknown subcommand "${sub}"\n\n`);
|
|
242
|
+
termHelp();
|
|
243
|
+
return 1;
|
|
244
|
+
}
|
|
245
|
+
}
|
package/ts/widgets.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Aggregate entry for the agent-yes browser widgets: `import { AyTerminal,
|
|
2
|
+
// AyChannel } from "agent-yes/widgets"`.
|
|
3
|
+
//
|
|
4
|
+
// Named exports only — NO default export. The plural name means "the collection
|
|
5
|
+
// of widgets"; each individual widget also ships as its own singular subpath
|
|
6
|
+
// (`agent-yes/terminal`, `agent-yes/channels`) which is the tree-shakeable import
|
|
7
|
+
// to prefer when you only need one — the terminal widget inlines xterm.js and is
|
|
8
|
+
// heavy, so a chat-only page should import `agent-yes/channels` directly rather
|
|
9
|
+
// than pull this aggregate. The CDN keeps them as separate files too
|
|
10
|
+
// (/w/terminal.js, /w/channels.js).
|
|
11
|
+
export { AyTerminal } from "./terminal/browser.ts";
|
|
12
|
+
export type { AyTerminalInfo } from "./terminal/browser.ts";
|
|
13
|
+
export { AyChannel } from "./channels/browser.ts";
|
|
14
|
+
export type { AyChannelInfo } from "./channels/browser.ts";
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import "./ts-D1FDmhc-.js";
|
|
2
|
-
import "./logger-CDIsZ-Pp.js";
|
|
3
|
-
import "./versionChecker-DJEtU1JU.js";
|
|
4
|
-
import "./todoAutomation-x6guaQXc.js";
|
|
5
|
-
import "./JsonlStore-CWOA3aDH.js";
|
|
6
|
-
import "./globalPidIndex-Ca4sTr1b.js";
|
|
7
|
-
import "./pidStore-Hjba3K6Q.js";
|
|
8
|
-
import "./messageLog-zVGWLX7w.js";
|
|
9
|
-
import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-C7bkkXue.js";
|
|
10
|
-
|
|
11
|
-
export { SUPPORTED_CLIS };
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import "./logger-CDIsZ-Pp.js";
|
|
2
|
-
import "./globalPidIndex-Ca4sTr1b.js";
|
|
3
|
-
import "./messageLog-zVGWLX7w.js";
|
|
4
|
-
import "./e2e-CYlKpfxa.js";
|
|
5
|
-
import "./configShared-BXz2vi4Q.js";
|
|
6
|
-
import "./subcommands-_Ci82sb1.js";
|
|
7
|
-
import "./webrtcLink-CEYNs0pt.js";
|
|
8
|
-
import "./remotes-BDdfhL6N.js";
|
|
9
|
-
import "./callbackCore-Me97qn68.js";
|
|
10
|
-
import { i as loadOrCreateCallbackSecret, n as isCallbackRevoked, r as loadCallbackSecretReadOnly, t as cmdCallback } from "./callback-B1AWp2tC.js";
|
|
11
|
-
|
|
12
|
-
export { cmdCallback };
|
package/dist/peer-CX4qQx5U.js
DELETED