shadok-ai 0.11.0 → 0.11.2
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/README.md +11 -1
- package/dist/channels.d.ts +21 -0
- package/dist/channels.js +30 -2
- package/dist/channels.js.map +1 -1
- package/dist/first-agent.d.ts +40 -0
- package/dist/first-agent.js +40 -1
- package/dist/first-agent.js.map +1 -1
- package/dist/server.js +41 -2
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
- package/public/channel-store.js +14 -0
- package/public/index.html +114 -17
package/README.md
CHANGED
|
@@ -165,6 +165,14 @@ Enter to skip; you can add it later from the web UI).
|
|
|
165
165
|
a brand-new instance (which is signed out at boot, so there is nothing to
|
|
166
166
|
spawn yet). The condition is "no channel", which makes it idempotent: it never
|
|
167
167
|
appears twice.
|
|
168
|
+
While it is being started the central panel says so — *starting your first
|
|
169
|
+
agent…* — instead of the *no agent open* invitation, which would ask you to
|
|
170
|
+
create a second one while the first is being born. It is a status, not a
|
|
171
|
+
screen: nothing to click, nothing to dismiss, and it ends on its own whichever
|
|
172
|
+
way the spawn goes (started, refused because the instance is signed out,
|
|
173
|
+
failed). The two look identical from the browser — an empty cockpit is an
|
|
174
|
+
empty cockpit — so the server is asked (`GET /first-agent`) rather than
|
|
175
|
+
guessed at, and the agent list is reconciled faster while the answer is yes.
|
|
168
176
|
It is the environment's **home base**: pinned at the top of the list, with no
|
|
169
177
|
close button and no *Close agent* in its menu. You can still reload, rename,
|
|
170
178
|
re-profile or mute it — "permanent" should not mean "stuck". A cockpit that
|
|
@@ -580,7 +588,9 @@ cockpit's name, per launch directory: click the header brand to rename it, so
|
|
|
580
588
|
several cockpits stay apart in the tab bar; an empty PUT reverts to the default),
|
|
581
589
|
`/theme` (GET/PUT — the cockpit's colour palette, per launch directory: an accent
|
|
582
590
|
key picked from the ⋯ menu, e.g. `emerald`; unknown/`amber` reverts to default),
|
|
583
|
-
`/profiles`, `/secrets`, `/telegram`, `/defaults`, `/
|
|
591
|
+
`/profiles`, `/secrets`, `/telegram`, `/defaults`, `/first-agent` (GET —
|
|
592
|
+
`{pending, reason}`: whether this instance's lead agent is being started
|
|
593
|
+
right now), `/version`, `/autoupdate`,
|
|
584
594
|
`/update-channel` (POST `{channel}` — `alpha` or `beta`), `/permission-mode`, `/tweak/prepare` (POST — clone/refresh shadok-ai's own source,
|
|
585
595
|
returns the cwd to start the tweak agent in), and the sign-in group: `/auth` (GET
|
|
586
596
|
— `{loggedIn, email?, subscriptionType?}`), `/auth/login` (POST — start a flow,
|
package/dist/channels.d.ts
CHANGED
|
@@ -93,6 +93,27 @@ export declare function homeChannelForGeneral(channels: Channel[]): string | nul
|
|
|
93
93
|
export declare function dedupById(list: Channel[]): Channel[];
|
|
94
94
|
export declare function loadChannels(): Channel[];
|
|
95
95
|
export declare function saveChannels(list: Channel[]): void;
|
|
96
|
+
/**
|
|
97
|
+
* A browser tab belongs to the instance it was LOADED from. The page carries
|
|
98
|
+
* that instance's launch-dir key (stamped by `injectInstanceKey`), and a
|
|
99
|
+
* mutating call (`PUT /channels`, `PUT /groups`) sends it back. A stale tab
|
|
100
|
+
* whose server was stopped and replaced by another instance on the same port
|
|
101
|
+
* would otherwise PUT its in-memory channels into the NEW instance's file. The
|
|
102
|
+
* write is refused only on an EXPLICIT mismatch: a client that sends no key
|
|
103
|
+
* (a pre-fix page, or a non-browser caller that never PUTs channels anyway) is
|
|
104
|
+
* allowed, so the guard adds isolation without breaking anything.
|
|
105
|
+
*/
|
|
106
|
+
export declare function channelWriteAllowed(serverKey: string, clientKey: string | undefined | null): boolean;
|
|
107
|
+
/**
|
|
108
|
+
* Drop a channel that is another instance's HOME (lead) — a `home` channel whose
|
|
109
|
+
* cwd is a different launch directory. Its "general" has no place in this
|
|
110
|
+
* instance's file; it lands there only through the stale-tab contamination
|
|
111
|
+
* above. Non-home agents legitimately run in worktrees with a different cwd, so
|
|
112
|
+
* only `home` is filtered; an empty cwd is kept (own home, cwd not yet
|
|
113
|
+
* asserted at `ready`). Applied on both read and write, so an already-poisoned
|
|
114
|
+
* file self-heals on the next load or save.
|
|
115
|
+
*/
|
|
116
|
+
export declare function dropForeignHomes(list: Channel[], serverCwd: string): Channel[];
|
|
96
117
|
/**
|
|
97
118
|
* Insert or update a channel by sessionId, shallow-merging the given fields
|
|
98
119
|
* (an `undefined` field never clobbers an existing value). The server calls
|
package/dist/channels.js
CHANGED
|
@@ -110,10 +110,38 @@ export function dedupById(list) {
|
|
|
110
110
|
return out;
|
|
111
111
|
}
|
|
112
112
|
export function loadChannels() {
|
|
113
|
-
|
|
113
|
+
// dropForeignHomes on READ too: a file poisoned by an older build (a stale tab
|
|
114
|
+
// that PUT another instance's home before the write guard existed) is cleaned
|
|
115
|
+
// the moment it is read, so /channels never surfaces a foreign "general".
|
|
116
|
+
return dropForeignHomes(dedupById(readJson("channels").filter((c) => c && typeof c.sessionId === "string")), process.cwd());
|
|
114
117
|
}
|
|
115
118
|
export function saveChannels(list) {
|
|
116
|
-
writeJson("channels", list);
|
|
119
|
+
writeJson("channels", dropForeignHomes(list, process.cwd()));
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* A browser tab belongs to the instance it was LOADED from. The page carries
|
|
123
|
+
* that instance's launch-dir key (stamped by `injectInstanceKey`), and a
|
|
124
|
+
* mutating call (`PUT /channels`, `PUT /groups`) sends it back. A stale tab
|
|
125
|
+
* whose server was stopped and replaced by another instance on the same port
|
|
126
|
+
* would otherwise PUT its in-memory channels into the NEW instance's file. The
|
|
127
|
+
* write is refused only on an EXPLICIT mismatch: a client that sends no key
|
|
128
|
+
* (a pre-fix page, or a non-browser caller that never PUTs channels anyway) is
|
|
129
|
+
* allowed, so the guard adds isolation without breaking anything.
|
|
130
|
+
*/
|
|
131
|
+
export function channelWriteAllowed(serverKey, clientKey) {
|
|
132
|
+
return !clientKey || clientKey === serverKey;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Drop a channel that is another instance's HOME (lead) — a `home` channel whose
|
|
136
|
+
* cwd is a different launch directory. Its "general" has no place in this
|
|
137
|
+
* instance's file; it lands there only through the stale-tab contamination
|
|
138
|
+
* above. Non-home agents legitimately run in worktrees with a different cwd, so
|
|
139
|
+
* only `home` is filtered; an empty cwd is kept (own home, cwd not yet
|
|
140
|
+
* asserted at `ready`). Applied on both read and write, so an already-poisoned
|
|
141
|
+
* file self-heals on the next load or save.
|
|
142
|
+
*/
|
|
143
|
+
export function dropForeignHomes(list, serverCwd) {
|
|
144
|
+
return list.filter((c) => !(c.home && c.cwd && c.cwd !== serverCwd));
|
|
117
145
|
}
|
|
118
146
|
/**
|
|
119
147
|
* Insert or update a channel by sessionId, shallow-merging the given fields
|
package/dist/channels.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channels.js","sourceRoot":"","sources":["../src/channels.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"channels.js","sourceRoot":"","sources":["../src/channels.ts"],"names":[],"mappings":"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"}
|
package/dist/first-agent.d.ts
CHANGED
|
@@ -30,6 +30,46 @@ export declare function firstAgentPlan(input: {
|
|
|
30
30
|
channelCount: number;
|
|
31
31
|
authState: AuthState;
|
|
32
32
|
}): FirstAgentPlan;
|
|
33
|
+
/**
|
|
34
|
+
* What the cockpit is allowed to SAY while it has no agent to show.
|
|
35
|
+
*
|
|
36
|
+
* The browser cannot work this out on its own: "a first agent is on its way"
|
|
37
|
+
* and "the user closed their last tab" are the same zero channels (invariant
|
|
38
|
+
* 18, which is why `active` can be null). Guessing picks one of two wrong
|
|
39
|
+
* answers — either a returning user is told forever that their first agent is
|
|
40
|
+
* starting, or a brand-new one is invited to create a SECOND lead agent while
|
|
41
|
+
* the first is being born. So the side doing the spawning says which it is.
|
|
42
|
+
*
|
|
43
|
+
* The state is deliberately hard to leave switched on. Every exit from
|
|
44
|
+
* `ensureFirstAgent` goes through `settleFirstAgent`, including the ones that
|
|
45
|
+
* spawn nothing (`not-signed-in`, `channels-exist`), the socket erroring and
|
|
46
|
+
* the 60s guard — because a flag that could stick would leave a signed-out
|
|
47
|
+
* cockpit reading "starting your first agent…" forever, which is a worse first
|
|
48
|
+
* impression than the empty state this replaces.
|
|
49
|
+
*/
|
|
50
|
+
export interface FirstAgentStatus {
|
|
51
|
+
/** Is a lead agent genuinely being started right now? */
|
|
52
|
+
pending: boolean;
|
|
53
|
+
/** Why — the plan's reason once one has been computed, before that "starting". */
|
|
54
|
+
reason: FirstAgentPlan["reason"] | "starting" | "idle";
|
|
55
|
+
}
|
|
56
|
+
/** A copy, so no caller can hold a handle on the state and edit it. */
|
|
57
|
+
export declare function firstAgentStatus(): FirstAgentStatus;
|
|
58
|
+
/**
|
|
59
|
+
* Say a spawn is coming, BEFORE the attempt itself.
|
|
60
|
+
*
|
|
61
|
+
* The boot path defers `ensureFirstAgent` a beat (so it dials a server already
|
|
62
|
+
* accepting) and opens the browser first — so without this the very page this
|
|
63
|
+
* status exists for loads during that gap and is told "idle", which is the bug.
|
|
64
|
+
* The auth probe inside `ensureFirstAgent` costs another ~850ms on top.
|
|
65
|
+
*
|
|
66
|
+
* Authoritative, not sticky: called with channels present it CLEARS the flag
|
|
67
|
+
* rather than leaving a stale one — an instance that has agents has nothing
|
|
68
|
+
* pending by definition.
|
|
69
|
+
*/
|
|
70
|
+
export declare function announceFirstAgent(channelCount: number): void;
|
|
71
|
+
/** The one way out of `pending`. Never conditional: every reason ends the wait. */
|
|
72
|
+
export declare function settleFirstAgent(reason: FirstAgentPlan["reason"]): void;
|
|
33
73
|
/**
|
|
34
74
|
* Start the lead agent if this instance has none. Idempotent by construction:
|
|
35
75
|
* the condition is "no channel at all", so both callers can call it freely.
|
package/dist/first-agent.js
CHANGED
|
@@ -32,6 +32,33 @@ export function firstAgentPlan(input) {
|
|
|
32
32
|
return { spawn: false, reason: "not-signed-in" };
|
|
33
33
|
return { spawn: true, reason: "first-boot", name: FIRST_AGENT_NAME, profile: BOSS_PROFILE_NAME };
|
|
34
34
|
}
|
|
35
|
+
let status = { pending: false, reason: "idle" };
|
|
36
|
+
/** A copy, so no caller can hold a handle on the state and edit it. */
|
|
37
|
+
export function firstAgentStatus() {
|
|
38
|
+
return { ...status };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Say a spawn is coming, BEFORE the attempt itself.
|
|
42
|
+
*
|
|
43
|
+
* The boot path defers `ensureFirstAgent` a beat (so it dials a server already
|
|
44
|
+
* accepting) and opens the browser first — so without this the very page this
|
|
45
|
+
* status exists for loads during that gap and is told "idle", which is the bug.
|
|
46
|
+
* The auth probe inside `ensureFirstAgent` costs another ~850ms on top.
|
|
47
|
+
*
|
|
48
|
+
* Authoritative, not sticky: called with channels present it CLEARS the flag
|
|
49
|
+
* rather than leaving a stale one — an instance that has agents has nothing
|
|
50
|
+
* pending by definition.
|
|
51
|
+
*/
|
|
52
|
+
export function announceFirstAgent(channelCount) {
|
|
53
|
+
status =
|
|
54
|
+
channelCount > 0
|
|
55
|
+
? { pending: false, reason: "channels-exist" }
|
|
56
|
+
: { pending: true, reason: "starting" };
|
|
57
|
+
}
|
|
58
|
+
/** The one way out of `pending`. Never conditional: every reason ends the wait. */
|
|
59
|
+
export function settleFirstAgent(reason) {
|
|
60
|
+
status = { pending: false, reason };
|
|
61
|
+
}
|
|
35
62
|
/** Guards the two callers (boot, sign-in) against firing at the same moment. */
|
|
36
63
|
let inFlight = false;
|
|
37
64
|
/**
|
|
@@ -48,8 +75,15 @@ export async function ensureFirstAgent(deps) {
|
|
|
48
75
|
channelCount: loadChannels().length,
|
|
49
76
|
authState: (await authStatus()).state,
|
|
50
77
|
});
|
|
51
|
-
if (!plan.spawn)
|
|
78
|
+
if (!plan.spawn) {
|
|
79
|
+
settleFirstAgent(plan.reason);
|
|
52
80
|
return plan.reason;
|
|
81
|
+
}
|
|
82
|
+
// The sign-in path reaches here without the boot path's announcement, and the
|
|
83
|
+
// auth probe above has just spent ~850ms — say it now, so the window in which
|
|
84
|
+
// the page could be told "idle" while a spawn is under way is closed at both
|
|
85
|
+
// ends rather than only at boot.
|
|
86
|
+
announceFirstAgent(0);
|
|
53
87
|
inFlight = true;
|
|
54
88
|
try {
|
|
55
89
|
await new Promise((resolve) => {
|
|
@@ -100,6 +134,11 @@ export async function ensureFirstAgent(deps) {
|
|
|
100
134
|
}
|
|
101
135
|
finally {
|
|
102
136
|
inFlight = false;
|
|
137
|
+
// In the `finally` on purpose: the spawn resolves on `ready`, on `error`,
|
|
138
|
+
// on `exited`, on a socket failure and on the 60s guard, and every one of
|
|
139
|
+
// them has to end the "starting…" status. `onReady` has already written the
|
|
140
|
+
// channel by now, so the client sees the tab and the cleared flag together.
|
|
141
|
+
settleFirstAgent("first-boot");
|
|
103
142
|
}
|
|
104
143
|
return "first-boot";
|
|
105
144
|
}
|
package/dist/first-agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"first-agent.js","sourceRoot":"","sources":["../src/first-agent.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAkB,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD;;;;;;;;;;;GAWG;AAEH,uDAAuD;AACvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAS1C;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,KAG9B;IACC,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC9E,0EAA0E;IAC1E,iFAAiF;IACjF,IAAI,KAAK,CAAC,SAAS,KAAK,WAAW;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACtF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;AACnG,CAAC;AAED,gFAAgF;AAChF,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAMtC;IACC,IAAI,QAAQ;QAAE,OAAO,gBAAgB,CAAC;IACtC,MAAM,IAAI,GAAG,cAAc,CAAC;QAC1B,YAAY,EAAE,YAAY,EAAE,CAAC,MAAM;QACnC,SAAS,EAAE,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC,KAAK;KACtC,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,KAAK;
|
|
1
|
+
{"version":3,"file":"first-agent.js","sourceRoot":"","sources":["../src/first-agent.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -18,7 +18,7 @@ import { PtyPilot } from "./session.js";
|
|
|
18
18
|
import { ensureClaudeHome, ensureProjectTrusted } from "./claude-home.js";
|
|
19
19
|
import { authStatus, cancelLogin, startLogin, submitLoginCode } from "./claude-auth.js";
|
|
20
20
|
import { starCount } from "./stars.js";
|
|
21
|
-
import { ensureFirstAgent } from "./first-agent.js";
|
|
21
|
+
import { announceFirstAgent, ensureFirstAgent, firstAgentStatus, settleFirstAgent, } from "./first-agent.js";
|
|
22
22
|
import { readGroundAt } from "./ground.js";
|
|
23
23
|
import { homeGreetingBrief } from "./greeting.js";
|
|
24
24
|
import { ensureSshIdentity } from "./ssh.js";
|
|
@@ -30,7 +30,7 @@ import { scanUsage, sessionFilePath, tailSession, clearTailPos, seedTailPos, isN
|
|
|
30
30
|
import { detectFork, rootIdOfFile } from "./forktrace.js";
|
|
31
31
|
import { computePace, paceBlock, WINDOW_SEC } from "./pace.js";
|
|
32
32
|
import { getUsage } from "./usage.js";
|
|
33
|
-
import { loadChannels, loadGroups, saveGroups, upsertChannel, removeChannel, mergeClientChannels, loadTgGroup, saveTgGroup, isHomeChannel, homeAdoptionTarget, resolveSessionTarget, resumeTarget, } from "./channels.js";
|
|
33
|
+
import { loadChannels, loadGroups, saveGroups, upsertChannel, removeChannel, mergeClientChannels, channelWriteAllowed, loadTgGroup, saveTgGroup, isHomeChannel, homeAdoptionTarget, resolveSessionTarget, resumeTarget, } from "./channels.js";
|
|
34
34
|
import { deliverWithRetry } from "./reload.js";
|
|
35
35
|
import { startTelegram, renameTelegramTopic, closeTelegramTopic, probeToken, isStalePreface, announceLoggedOut, resetLoggedOutNotice, attachmentPrompt, pasteFileName, MEDIA_DIR, } from "./telegram.js";
|
|
36
36
|
import { migrateTgBindings } from "./channels.js";
|
|
@@ -183,6 +183,9 @@ function greetHomeAgent(id) {
|
|
|
183
183
|
});
|
|
184
184
|
}
|
|
185
185
|
async function startFirstAgent() {
|
|
186
|
+
// Before the attempt, not after it: the browser may already be loading, and
|
|
187
|
+
// the empty state it would otherwise paint invites a SECOND lead agent.
|
|
188
|
+
announceFirstAgent(loadChannels().length);
|
|
186
189
|
try {
|
|
187
190
|
const why = await ensureFirstAgent({
|
|
188
191
|
port: boundPort,
|
|
@@ -205,6 +208,11 @@ async function startFirstAgent() {
|
|
|
205
208
|
console.log(`first agent: skipped (${why})`);
|
|
206
209
|
}
|
|
207
210
|
catch (e) {
|
|
211
|
+
// `ensureFirstAgent` settles its own status in a `finally`, but it can also
|
|
212
|
+
// throw BEFORE reaching it (reading the channel list, probing auth). A
|
|
213
|
+
// cockpit stuck on "starting your first agent…" is exactly what this
|
|
214
|
+
// feature must never produce, so the outermost handler ends the wait too.
|
|
215
|
+
settleFirstAgent("not-signed-in");
|
|
208
216
|
console.log(`first agent: could not start — ${e instanceof Error ? e.message : String(e)}`);
|
|
209
217
|
}
|
|
210
218
|
}
|
|
@@ -967,6 +975,17 @@ app.get("/defaults", (_req, res) => {
|
|
|
967
975
|
// share it. One source of truth with the server's own per-dir keying.
|
|
968
976
|
res.json({ cwd: process.cwd(), instanceKey: instanceKey() });
|
|
969
977
|
});
|
|
978
|
+
// Is the instance's lead agent on its way? A page with no channel cannot tell
|
|
979
|
+
// "one is being born" from "you closed your last tab" — both are zero channels
|
|
980
|
+
// (invariant 18) — and the difference decides whether it invites the user to
|
|
981
|
+
// create an agent or asks them to wait. Its own route rather than a field on
|
|
982
|
+
// `/defaults`, because the two have different lifetimes: `/defaults` hands out
|
|
983
|
+
// facts that cannot change under the page (the launch dir, its `instanceKey`)
|
|
984
|
+
// and is read once, while this one changes while the page watches and is
|
|
985
|
+
// POLLED — for as long as it answers `pending`, and never after.
|
|
986
|
+
app.get("/first-agent", (_req, res) => {
|
|
987
|
+
res.json(firstAgentStatus());
|
|
988
|
+
});
|
|
970
989
|
// Cockpit name (header brand + browser tab), per launch directory — so several
|
|
971
990
|
// cockpits stay distinguishable across a reload. Empty PUT clears it.
|
|
972
991
|
app.get("/title", (_req, res) => {
|
|
@@ -1137,6 +1156,14 @@ app.delete("/crons", (req, res) => {
|
|
|
1137
1156
|
res.json({ ok: true, id: r.id });
|
|
1138
1157
|
});
|
|
1139
1158
|
app.put("/channels", (req, res) => {
|
|
1159
|
+
// A stale tab whose server was stopped and replaced by another instance on the
|
|
1160
|
+
// same port must not write its old channels into THIS instance's file. The
|
|
1161
|
+
// page carries the launch-dir key it was loaded from; refuse an explicit
|
|
1162
|
+
// mismatch. Return the live list so the confused client can reconcile.
|
|
1163
|
+
const clientKey = req.get("x-shadok-instance");
|
|
1164
|
+
if (!channelWriteAllowed(instanceKey(), clientKey)) {
|
|
1165
|
+
return res.status(409).json({ error: "instance-mismatch", channels: loadChannels() });
|
|
1166
|
+
}
|
|
1140
1167
|
// Merge, don't overwrite: the browser owns order + name/group, but must never
|
|
1141
1168
|
// drop a live or Telegram-bound session or strip server-owned fields.
|
|
1142
1169
|
const live = new Set([...sessions.values()].filter((s) => !s.pilot.hasExited).map((s) => s.id));
|
|
@@ -1164,6 +1191,9 @@ app.delete("/channel", async (req, res) => {
|
|
|
1164
1191
|
});
|
|
1165
1192
|
app.get("/groups", (_req, res) => res.json(loadGroups()));
|
|
1166
1193
|
app.put("/groups", (req, res) => {
|
|
1194
|
+
if (!channelWriteAllowed(instanceKey(), req.get("x-shadok-instance"))) {
|
|
1195
|
+
return res.status(409).json({ error: "instance-mismatch" });
|
|
1196
|
+
}
|
|
1167
1197
|
saveGroups(Array.isArray(req.body) ? req.body : []);
|
|
1168
1198
|
res.json({ ok: true });
|
|
1169
1199
|
});
|
|
@@ -1979,6 +2009,9 @@ async function restartSession(s) {
|
|
|
1979
2009
|
// reload instead of pausing.
|
|
1980
2010
|
broadcast(s, {
|
|
1981
2011
|
type: "ready",
|
|
2012
|
+
// Which instance is answering this origin — the client compares it to the
|
|
2013
|
+
// launch dir stamped in its page and stops writing on a mismatch (swap).
|
|
2014
|
+
instanceKey: instanceKey(),
|
|
1982
2015
|
sessionId: s.id,
|
|
1983
2016
|
preprompt: prepromptById.get(s.id) ?? [],
|
|
1984
2017
|
cwd: s.cwd,
|
|
@@ -2831,6 +2864,7 @@ wss.on("connection", (ws, req) => {
|
|
|
2831
2864
|
send({ type: "history", turns });
|
|
2832
2865
|
send({
|
|
2833
2866
|
type: "ready",
|
|
2867
|
+
instanceKey: instanceKey(),
|
|
2834
2868
|
sessionId: id,
|
|
2835
2869
|
preprompt: prepromptById.get(id) ?? [],
|
|
2836
2870
|
cwd: session.cwd,
|
|
@@ -2893,6 +2927,7 @@ wss.on("connection", (ws, req) => {
|
|
|
2893
2927
|
}
|
|
2894
2928
|
send({
|
|
2895
2929
|
type: "ready",
|
|
2930
|
+
instanceKey: instanceKey(),
|
|
2896
2931
|
sessionId: id,
|
|
2897
2932
|
preprompt: prepromptById.get(id) ?? [],
|
|
2898
2933
|
cwd: effectiveCwd,
|
|
@@ -3543,6 +3578,10 @@ server.listen(port, HOST, () => {
|
|
|
3543
3578
|
// would delay the window for nothing.
|
|
3544
3579
|
openBrowser("http://localhost:" + port);
|
|
3545
3580
|
adoptHomeChannel();
|
|
3581
|
+
// Announce here, not only inside the deferred call: the browser is opening
|
|
3582
|
+
// NOW and would otherwise be told there is nothing coming for a second and a
|
|
3583
|
+
// half — the whole window this status exists to fill.
|
|
3584
|
+
announceFirstAgent(loadChannels().length);
|
|
3546
3585
|
setTimeout(() => void startFirstAgent(), 1500).unref?.();
|
|
3547
3586
|
});
|
|
3548
3587
|
//# sourceMappingURL=server.js.map
|