@synap-core/cli 1.12.2 → 1.13.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.
Files changed (234) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +25 -8
  3. package/dist/build-info.json +2 -2
  4. package/dist/commands/agents.d.ts +0 -1
  5. package/dist/commands/agents.js +1 -1
  6. package/dist/commands/agents.js.map +1 -1
  7. package/dist/commands/app.js +2 -1
  8. package/dist/commands/app.js.map +1 -1
  9. package/dist/commands/automation.js +46 -41
  10. package/dist/commands/automation.js.map +1 -1
  11. package/dist/commands/box.d.ts +42 -0
  12. package/dist/commands/box.js +89 -0
  13. package/dist/commands/box.js.map +1 -0
  14. package/dist/commands/bridge-setup.js +3 -1
  15. package/dist/commands/bridge-setup.js.map +1 -1
  16. package/dist/commands/capability.d.ts +1 -1
  17. package/dist/commands/capability.js +57 -34
  18. package/dist/commands/capability.js.map +1 -1
  19. package/dist/commands/close-questions.d.ts +27 -0
  20. package/dist/commands/close-questions.js +49 -0
  21. package/dist/commands/close-questions.js.map +1 -0
  22. package/dist/commands/close-questions.test.d.ts +1 -0
  23. package/dist/commands/close-questions.test.js +52 -0
  24. package/dist/commands/close-questions.test.js.map +1 -0
  25. package/dist/commands/connect.d.ts +1 -3
  26. package/dist/commands/connect.js +2 -2
  27. package/dist/commands/connect.js.map +1 -1
  28. package/dist/commands/context.js +72 -43
  29. package/dist/commands/context.js.map +1 -1
  30. package/dist/commands/data-extra.js +12 -4
  31. package/dist/commands/data-extra.js.map +1 -1
  32. package/dist/commands/data.js +2 -1
  33. package/dist/commands/data.js.map +1 -1
  34. package/dist/commands/doctor.d.ts +21 -0
  35. package/dist/commands/doctor.js +108 -13
  36. package/dist/commands/doctor.js.map +1 -1
  37. package/dist/commands/hooks.d.ts +19 -0
  38. package/dist/commands/hooks.js +70 -0
  39. package/dist/commands/hooks.js.map +1 -0
  40. package/dist/commands/import.d.ts +25 -0
  41. package/dist/commands/import.js +98 -12
  42. package/dist/commands/import.js.map +1 -1
  43. package/dist/commands/init.d.ts +14 -0
  44. package/dist/commands/init.js +59 -19
  45. package/dist/commands/init.js.map +1 -1
  46. package/dist/commands/knowledge.js +4 -2
  47. package/dist/commands/knowledge.js.map +1 -1
  48. package/dist/commands/lens.js +2 -1
  49. package/dist/commands/lens.js.map +1 -1
  50. package/dist/commands/market-authoring.js +1 -1
  51. package/dist/commands/market-authoring.js.map +1 -1
  52. package/dist/commands/mcp.js +2 -2
  53. package/dist/commands/mcp.js.map +1 -1
  54. package/dist/commands/observe.category.test.d.ts +1 -0
  55. package/dist/commands/observe.category.test.js +59 -0
  56. package/dist/commands/observe.category.test.js.map +1 -0
  57. package/dist/commands/observe.d.ts +3 -0
  58. package/dist/commands/observe.js +7 -5
  59. package/dist/commands/observe.js.map +1 -1
  60. package/dist/commands/observe.title.test.d.ts +1 -0
  61. package/dist/commands/observe.title.test.js +37 -0
  62. package/dist/commands/observe.title.test.js.map +1 -0
  63. package/dist/commands/playbook.js +9 -0
  64. package/dist/commands/playbook.js.map +1 -1
  65. package/dist/commands/pods.d.ts +6 -1
  66. package/dist/commands/pods.js +32 -15
  67. package/dist/commands/pods.js.map +1 -1
  68. package/dist/commands/proton-setup.js +3 -1
  69. package/dist/commands/proton-setup.js.map +1 -1
  70. package/dist/commands/session-feed-wait.d.ts +48 -0
  71. package/dist/commands/session-feed-wait.js +261 -0
  72. package/dist/commands/session-feed-wait.js.map +1 -0
  73. package/dist/commands/session-post.d.ts +40 -0
  74. package/dist/commands/session-post.js +96 -0
  75. package/dist/commands/session-post.js.map +1 -0
  76. package/dist/commands/session-wait.d.ts +9 -4
  77. package/dist/commands/session-wait.js +20 -5
  78. package/dist/commands/session-wait.js.map +1 -1
  79. package/dist/commands/sessions.d.ts +2 -0
  80. package/dist/commands/sessions.js +23 -0
  81. package/dist/commands/sessions.js.map +1 -1
  82. package/dist/commands/skills-commands.d.ts +2 -0
  83. package/dist/commands/skills-commands.js +9 -1
  84. package/dist/commands/skills-commands.js.map +1 -1
  85. package/dist/commands/skills-commands.test.d.ts +1 -0
  86. package/dist/commands/skills-commands.test.js +57 -0
  87. package/dist/commands/skills-commands.test.js.map +1 -0
  88. package/dist/commands/status.js +1 -1
  89. package/dist/commands/status.js.map +1 -1
  90. package/dist/commands/template.d.ts +42 -0
  91. package/dist/commands/template.js +191 -0
  92. package/dist/commands/template.js.map +1 -0
  93. package/dist/commands/tracks.d.ts +67 -6
  94. package/dist/commands/tracks.js +268 -16
  95. package/dist/commands/tracks.js.map +1 -1
  96. package/dist/commands/whoami.d.ts +7 -0
  97. package/dist/commands/whoami.js +17 -0
  98. package/dist/commands/whoami.js.map +1 -1
  99. package/dist/commands/worker-accounts.d.ts +149 -0
  100. package/dist/commands/worker-accounts.js +339 -0
  101. package/dist/commands/worker-accounts.js.map +1 -0
  102. package/dist/commands/worker-accounts.test.d.ts +1 -0
  103. package/dist/commands/worker-accounts.test.js +224 -0
  104. package/dist/commands/worker-accounts.test.js.map +1 -0
  105. package/dist/commands/worker.d.ts +219 -10
  106. package/dist/commands/worker.js +749 -117
  107. package/dist/commands/worker.js.map +1 -1
  108. package/dist/commands/worker.test.js +321 -10
  109. package/dist/commands/worker.test.js.map +1 -1
  110. package/dist/index.js +164 -27
  111. package/dist/index.js.map +1 -1
  112. package/dist/lib/agent-door.d.ts +1 -3
  113. package/dist/lib/agent-door.js +10 -7
  114. package/dist/lib/agent-door.js.map +1 -1
  115. package/dist/lib/auth.d.ts +3 -2
  116. package/dist/lib/auth.js +3 -3
  117. package/dist/lib/auth.js.map +1 -1
  118. package/dist/lib/box/egress.d.ts +82 -0
  119. package/dist/lib/box/egress.js +264 -0
  120. package/dist/lib/box/egress.js.map +1 -0
  121. package/dist/lib/box/evidence.d.ts +86 -0
  122. package/dist/lib/box/evidence.js +121 -0
  123. package/dist/lib/box/evidence.js.map +1 -0
  124. package/dist/lib/box/job-server.d.ts +72 -0
  125. package/dist/lib/box/job-server.js +246 -0
  126. package/dist/lib/box/job-server.js.map +1 -0
  127. package/dist/lib/box/provisioner.d.ts +83 -0
  128. package/dist/lib/box/provisioner.js +312 -0
  129. package/dist/lib/box/provisioner.js.map +1 -0
  130. package/dist/lib/box/proxmox.d.ts +112 -0
  131. package/dist/lib/box/proxmox.js +211 -0
  132. package/dist/lib/box/proxmox.js.map +1 -0
  133. package/dist/lib/box/wire.d.ts +98 -0
  134. package/dist/lib/box/wire.js +70 -0
  135. package/dist/lib/box/wire.js.map +1 -0
  136. package/dist/lib/browser-auth.d.ts +35 -0
  137. package/dist/lib/browser-auth.js +170 -0
  138. package/dist/lib/browser-auth.js.map +1 -0
  139. package/dist/lib/client-header.test.d.ts +1 -0
  140. package/dist/lib/client-header.test.js +85 -0
  141. package/dist/lib/client-header.test.js.map +1 -0
  142. package/dist/lib/conversation-headers.d.ts +24 -9
  143. package/dist/lib/conversation-headers.js +40 -3
  144. package/dist/lib/conversation-headers.js.map +1 -1
  145. package/dist/lib/credential-class.d.ts +28 -1
  146. package/dist/lib/credential-class.js +28 -6
  147. package/dist/lib/credential-class.js.map +1 -1
  148. package/dist/lib/exporter-coverage.d.ts +1 -1
  149. package/dist/lib/exporter-coverage.js +1 -1
  150. package/dist/lib/goal-words.d.ts +38 -0
  151. package/dist/lib/goal-words.js +112 -0
  152. package/dist/lib/goal-words.js.map +1 -0
  153. package/dist/lib/hub-client.d.ts +28 -7
  154. package/dist/lib/hub-client.js +75 -34
  155. package/dist/lib/hub-client.js.map +1 -1
  156. package/dist/lib/init-handoff.d.ts +8 -0
  157. package/dist/lib/init-handoff.js +9 -2
  158. package/dist/lib/init-handoff.js.map +1 -1
  159. package/dist/lib/key-source.d.ts +3 -1
  160. package/dist/lib/key-source.js +7 -4
  161. package/dist/lib/key-source.js.map +1 -1
  162. package/dist/lib/knowledge-title.d.ts +3 -2
  163. package/dist/lib/knowledge-title.js +3 -2
  164. package/dist/lib/knowledge-title.js.map +1 -1
  165. package/dist/lib/mcp-bridge.d.ts +7 -0
  166. package/dist/lib/mcp-bridge.js +34 -1
  167. package/dist/lib/mcp-bridge.js.map +1 -1
  168. package/dist/lib/mcp-bridge.test.js +31 -3
  169. package/dist/lib/mcp-bridge.test.js.map +1 -1
  170. package/dist/lib/openclaw.d.ts +32 -0
  171. package/dist/lib/openclaw.js +165 -0
  172. package/dist/lib/openclaw.js.map +1 -0
  173. package/dist/lib/pod-moved.d.ts +70 -0
  174. package/dist/lib/pod-moved.js +146 -0
  175. package/dist/lib/pod-moved.js.map +1 -0
  176. package/dist/lib/pod-reach.d.ts +39 -0
  177. package/dist/lib/pod-reach.js +117 -0
  178. package/dist/lib/pod-reach.js.map +1 -0
  179. package/dist/lib/pod-reach.test.d.ts +1 -0
  180. package/dist/lib/pod-reach.test.js +67 -0
  181. package/dist/lib/pod-reach.test.js.map +1 -0
  182. package/dist/lib/pod.d.ts +8 -0
  183. package/dist/lib/pod.js +12 -3
  184. package/dist/lib/pod.js.map +1 -1
  185. package/dist/lib/register-claude-code-mcp.test.d.ts +1 -0
  186. package/dist/lib/register-claude-code-mcp.test.js +78 -0
  187. package/dist/lib/register-claude-code-mcp.test.js.map +1 -0
  188. package/dist/lib/review-credential.js +3 -1
  189. package/dist/lib/review-credential.js.map +1 -1
  190. package/dist/lib/seed.d.ts +13 -0
  191. package/dist/lib/seed.js +135 -0
  192. package/dist/lib/seed.js.map +1 -0
  193. package/dist/lib/session-feed.d.ts +185 -0
  194. package/dist/lib/session-feed.js +257 -0
  195. package/dist/lib/session-feed.js.map +1 -0
  196. package/dist/lib/targets.d.ts +21 -3
  197. package/dist/lib/targets.js +52 -107
  198. package/dist/lib/targets.js.map +1 -1
  199. package/dist/lib/wake-hook-settings.d.ts +57 -0
  200. package/dist/lib/wake-hook-settings.js +153 -0
  201. package/dist/lib/wake-hook-settings.js.map +1 -0
  202. package/dist/lib/wake-state.d.ts +65 -0
  203. package/dist/lib/wake-state.js +122 -0
  204. package/dist/lib/wake-state.js.map +1 -0
  205. package/package.json +5 -2
  206. package/skills/README.md +1 -1
  207. package/skills/agent-os/SKILL.md +8 -8
  208. package/skills/synap/SKILL.md +141 -84
  209. package/skills/synap/code-skills.md +70 -0
  210. package/skills/synap/concepts.md +28 -20
  211. package/skills/synap/creative-loop.md +1 -1
  212. package/skills/synap/document-embeds.md +3 -1
  213. package/skills/synap/focus-sessions.md +16 -7
  214. package/skills/synap/from-intent.md +32 -16
  215. package/skills/synap/governance-rules.md +1 -1
  216. package/skills/synap/lenses.md +4 -4
  217. package/skills/synap/linking.md +2 -2
  218. package/skills/synap/mental-model.md +1 -1
  219. package/skills/synap/operating-mode-rules.md +1 -1
  220. package/skills/synap/quick-reference.md +2 -1
  221. package/skills/synap/reflexes.md +6 -6
  222. package/skills/synap/viewframe-cells.md +1 -1
  223. package/skills/synap/work-model.md +24 -10
  224. package/skills/synap/workspace-design.md +5 -5
  225. package/skills/synap/writes.md +16 -9
  226. package/skills/synap-app/SKILL.md +148 -66
  227. package/skills/synap-app/creating-the-base-app.md +12 -7
  228. package/skills/synap-app/governance.md +27 -16
  229. package/skills/synap-app/install-commands.md +18 -9
  230. package/skills/synap-app/overview.md +16 -9
  231. package/skills/synap-app/using-the-sdk.md +75 -25
  232. package/skills/synap-schema/SKILL.md +21 -21
  233. package/skills/synap-schema/intent-vocabulary-ssot.md +21 -21
  234. package/templates/box/runner.py +206 -0
@@ -0,0 +1,149 @@
1
+ /**
2
+ * `synap worker --accounts <file>`: which Claude account a run uses.
3
+ *
4
+ * The file (default ~/.config/synap-worker/accounts.json, owner-only) lists
5
+ * Claude Code setup-tokens in priority order:
6
+ *
7
+ * { "version": 1, "reserve": 2,
8
+ * "accounts": [ { "id": "dev", "label": "Dev", "token": "sk-ant-oat…", "design": true }, … ] }
9
+ *
10
+ * Before a launch every account is MEASURED with a 1-token request whose
11
+ * response headers carry the account's 5-hour and weekly use (the probe is
12
+ * ClaudeSwitch's, main.swift `probeOnce`). A probe that fails is UNMEASURED:
13
+ * it is never read as "has room" and never as "full".
14
+ *
15
+ * A token is a credential. It goes into the launched run's environment and
16
+ * into the probe's Authorization header — nowhere else: no state file, no run
17
+ * log, no line the worker prints. Everything else names an account by id.
18
+ */
19
+ export interface AccountSpec {
20
+ id: string;
21
+ label: string;
22
+ token: string;
23
+ /** Design runs (the Artifact tool) publish from this account and no other. */
24
+ design?: boolean;
25
+ }
26
+ export interface AccountsFile {
27
+ version: 1;
28
+ /** The non-design accounts with the most weekly room left stay unused, for the person. */
29
+ reserve: number;
30
+ accounts: AccountSpec[];
31
+ }
32
+ export declare function defaultAccountsFile(): string;
33
+ /**
34
+ * The accounts file, or `null` when the DEFAULT file does not exist (the
35
+ * worker then runs on the environment's token, as before). A file named with
36
+ * `--accounts` that is missing, or any file that does not parse or has the
37
+ * wrong shape, THROWS: a broken accounts file is never "no accounts".
38
+ * Error messages never quote a token.
39
+ */
40
+ export declare function loadAccountsFile(file: string | undefined): AccountsFile | null;
41
+ /** True when the file can be read by anyone but its owner. */
42
+ export declare function accountsFileTooOpen(file: string): boolean;
43
+ /** One measurement, from the `anthropic-ratelimit-unified-*` headers. Percents; times in ms. */
44
+ export interface Meter {
45
+ fiveHour?: number;
46
+ fiveHourReset?: number;
47
+ week?: number;
48
+ weekReset?: number;
49
+ /** The server refused the request on the account's own limit. */
50
+ rejected: boolean;
51
+ reset?: number;
52
+ claim?: string;
53
+ checkedAt: number;
54
+ }
55
+ export type ProbeResult = {
56
+ kind: "measured";
57
+ meter: Meter;
58
+ } | {
59
+ kind: "unmeasured";
60
+ reason: string;
61
+ } | {
62
+ kind: "refused";
63
+ reason: string;
64
+ };
65
+ /** Tried in order when a model is retired, so the probe outlives any one model name. */
66
+ export declare const PROBE_MODELS: string[];
67
+ export declare function meterFromHeaders(h: Headers, now: number): Meter;
68
+ /** Measure one account: the first probe model that exists answers. */
69
+ export declare function probeAccount(token: string, opts?: {
70
+ fetchImpl?: typeof fetch;
71
+ models?: string[];
72
+ now?: () => number;
73
+ }): Promise<ProbeResult>;
74
+ /** An account counts as full once its 5-hour or weekly window reaches this percent. */
75
+ export declare const FULL_AT_PERCENT = 95;
76
+ /** A measurement is reused this long before the account is measured again. */
77
+ export declare const MEASURE_TTL_MS: number;
78
+ export type Standing = {
79
+ kind: "room";
80
+ meter: Meter;
81
+ } | {
82
+ kind: "full";
83
+ until: number;
84
+ meter?: Meter;
85
+ } | {
86
+ kind: "refused";
87
+ reason: string;
88
+ } | {
89
+ kind: "unmeasured";
90
+ reason: string;
91
+ };
92
+ export declare function isFull(m: Meter, threshold?: number): boolean;
93
+ /** When the window that makes it full resets; a quarter of an hour when the server gave no time. */
94
+ export declare function fullUntil(m: Meter, threshold?: number): number;
95
+ /**
96
+ * What one account can take now, from its last probe and any "full until"
97
+ * mark a run left on it (a run that ended on a usage limit). A full window
98
+ * whose reset has passed is UNMEASURED until it is measured again — never room.
99
+ */
100
+ export declare function standingOf(probe: ProbeResult | undefined, markedFullUntil: number | undefined, now: number, threshold?: number): Standing;
101
+ /**
102
+ * The reserve: the `reserve` NON-design accounts with the most weekly room
103
+ * left — kept for the person's own morning. Only MEASURED accounts are ranked
104
+ * (an unmeasured one cannot be launched on anyway); a measured account whose
105
+ * weekly figure is missing ranks last. Ties go to file order.
106
+ */
107
+ export declare function reserveIds(accounts: AccountSpec[], standings: Map<string, Standing>, reserve: number): Set<string>;
108
+ export interface Selection {
109
+ account?: AccountSpec;
110
+ /** Why nothing was picked (no token in it). */
111
+ reason?: string;
112
+ }
113
+ /**
114
+ * Pick the account a run launches on.
115
+ *
116
+ * - A DESIGN run: only an account flagged `design` (the artifact belongs to
117
+ * the publishing account). None with room ⇒ nothing: wait, never another one.
118
+ * - Any other run: leave out the reserve; among the rest with room, the one
119
+ * whose 5-hour window resets SOONEST (use it or lose it); ties → file order.
120
+ * A design account comes last: it is spent on other runs only when no other
121
+ * account has room, so its quota stays for the designs only it can publish.
122
+ * An unmeasured, refused or full account is never picked.
123
+ */
124
+ export declare function selectAccount(file: AccountsFile, standings: Map<string, Standing>, opts: {
125
+ design: boolean;
126
+ }): Selection;
127
+ export declare function describeStanding(s: Standing | undefined): string;
128
+ /**
129
+ * The accounts plus what the worker knows about each: the last probe (reused
130
+ * for MEASURE_TTL_MS) and a "full until" mark left by a run that ended on a
131
+ * usage limit. In memory only: a restart measures again.
132
+ */
133
+ export declare class AccountPool {
134
+ readonly file: AccountsFile;
135
+ private readonly probe;
136
+ private readonly now;
137
+ private probes;
138
+ private marks;
139
+ constructor(file: AccountsFile, probe: (token: string) => Promise<ProbeResult>, now?: () => number);
140
+ byId(id: string | undefined): AccountSpec | undefined;
141
+ /** Measure every account whose measurement is stale (in parallel), skipping marked-full ones. */
142
+ measure(): Promise<Map<string, Standing>>;
143
+ standings(): Map<string, Standing>;
144
+ /** A run on this account ended on a usage limit: full until then, measured afresh after. */
145
+ markFull(id: string, until: number): void;
146
+ select(opts: {
147
+ design: boolean;
148
+ }): Selection;
149
+ }
@@ -0,0 +1,339 @@
1
+ /**
2
+ * `synap worker --accounts <file>`: which Claude account a run uses.
3
+ *
4
+ * The file (default ~/.config/synap-worker/accounts.json, owner-only) lists
5
+ * Claude Code setup-tokens in priority order:
6
+ *
7
+ * { "version": 1, "reserve": 2,
8
+ * "accounts": [ { "id": "dev", "label": "Dev", "token": "sk-ant-oat…", "design": true }, … ] }
9
+ *
10
+ * Before a launch every account is MEASURED with a 1-token request whose
11
+ * response headers carry the account's 5-hour and weekly use (the probe is
12
+ * ClaudeSwitch's, main.swift `probeOnce`). A probe that fails is UNMEASURED:
13
+ * it is never read as "has room" and never as "full".
14
+ *
15
+ * A token is a credential. It goes into the launched run's environment and
16
+ * into the probe's Authorization header — nowhere else: no state file, no run
17
+ * log, no line the worker prints. Everything else names an account by id.
18
+ */
19
+ import fs from "node:fs";
20
+ import os from "node:os";
21
+ import path from "node:path";
22
+ export function defaultAccountsFile() {
23
+ return path.join(os.homedir(), ".config", "synap-worker", "accounts.json");
24
+ }
25
+ const ID_RE = /^[A-Za-z0-9_-]{1,64}$/;
26
+ /**
27
+ * The accounts file, or `null` when the DEFAULT file does not exist (the
28
+ * worker then runs on the environment's token, as before). A file named with
29
+ * `--accounts` that is missing, or any file that does not parse or has the
30
+ * wrong shape, THROWS: a broken accounts file is never "no accounts".
31
+ * Error messages never quote a token.
32
+ */
33
+ export function loadAccountsFile(file) {
34
+ const explicit = file !== undefined;
35
+ const target = file ?? defaultAccountsFile();
36
+ if (!fs.existsSync(target)) {
37
+ if (explicit)
38
+ throw new Error(`accounts file ${target} does not exist`);
39
+ return null;
40
+ }
41
+ let data;
42
+ try {
43
+ data = JSON.parse(fs.readFileSync(target, "utf8"));
44
+ }
45
+ catch {
46
+ throw new Error(`accounts file ${target} is not valid JSON`);
47
+ }
48
+ const bad = (why) => new Error(`accounts file ${target}: ${why}`);
49
+ if (!data || typeof data !== "object")
50
+ throw bad("not an object");
51
+ const d = data;
52
+ if (d.version !== 1)
53
+ throw bad(`version must be 1`);
54
+ const reserve = d.reserve === undefined ? 0 : d.reserve;
55
+ if (typeof reserve !== "number" || !Number.isInteger(reserve) || reserve < 0)
56
+ throw bad("reserve must be a whole number ≥ 0");
57
+ if (!Array.isArray(d.accounts) || d.accounts.length === 0)
58
+ throw bad("accounts must be a non-empty list");
59
+ const seen = new Set();
60
+ const accounts = d.accounts.map((raw, i) => {
61
+ const a = (raw ?? {});
62
+ if (typeof a.id !== "string" || !ID_RE.test(a.id))
63
+ throw bad(`accounts[${i}].id must match ${ID_RE}`);
64
+ if (seen.has(a.id))
65
+ throw bad(`account id "${a.id}" appears twice`);
66
+ seen.add(a.id);
67
+ if (typeof a.token !== "string" || a.token.trim() === "")
68
+ throw bad(`account "${a.id}" has no token`);
69
+ return {
70
+ id: a.id,
71
+ label: typeof a.label === "string" && a.label.trim() ? a.label : a.id,
72
+ token: a.token.trim(),
73
+ ...(a.design === true ? { design: true } : {}),
74
+ };
75
+ });
76
+ return { version: 1, reserve, accounts };
77
+ }
78
+ /** True when the file can be read by anyone but its owner. */
79
+ export function accountsFileTooOpen(file) {
80
+ try {
81
+ return (fs.statSync(file).mode & 0o077) !== 0;
82
+ }
83
+ catch {
84
+ return false;
85
+ }
86
+ }
87
+ /** Tried in order when a model is retired, so the probe outlives any one model name. */
88
+ export const PROBE_MODELS = ["claude-haiku-4-5", "claude-haiku-5-5", "claude-sonnet-5-5"];
89
+ export function meterFromHeaders(h, now) {
90
+ const get = (name) => h.get(`anthropic-ratelimit-unified-${name}`);
91
+ const num = (name) => {
92
+ const v = get(name);
93
+ if (v === null || v.trim() === "")
94
+ return undefined;
95
+ const n = Number(v);
96
+ return Number.isFinite(n) ? n : undefined;
97
+ };
98
+ // Utilization is a fraction of the window (0.15 = 15%) and can pass 1 when over.
99
+ const pct = (name) => {
100
+ const n = num(name);
101
+ return n === undefined ? undefined : n * 100;
102
+ };
103
+ const at = (name) => {
104
+ const n = num(name);
105
+ return n === undefined ? undefined : n * 1000;
106
+ };
107
+ return {
108
+ fiveHour: pct("5h-utilization"),
109
+ fiveHourReset: at("5h-reset"),
110
+ week: pct("7d-utilization"),
111
+ weekReset: at("7d-reset"),
112
+ rejected: get("status") === "rejected",
113
+ reset: at("reset"),
114
+ claim: get("representative-claim") ?? undefined,
115
+ checkedAt: now,
116
+ };
117
+ }
118
+ async function probeOnce(token, model, fetchImpl, now) {
119
+ let res;
120
+ try {
121
+ res = await fetchImpl("https://api.anthropic.com/v1/messages", {
122
+ method: "POST",
123
+ headers: {
124
+ Authorization: `Bearer ${token}`,
125
+ "anthropic-version": "2023-06-01",
126
+ "anthropic-beta": "oauth-2025-04-20",
127
+ "content-type": "application/json",
128
+ },
129
+ body: JSON.stringify({ model, max_tokens: 1, messages: [{ role: "user", content: "ok" }] }),
130
+ signal: AbortSignal.timeout(15_000),
131
+ });
132
+ }
133
+ catch (err) {
134
+ return { result: { kind: "unmeasured", reason: `probe failed: ${err.name}` }, modelMissing: false };
135
+ }
136
+ let error;
137
+ try {
138
+ error = (await res.json())?.error;
139
+ }
140
+ catch {
141
+ error = undefined;
142
+ }
143
+ const message = error?.message ?? `HTTP ${res.status}`;
144
+ const meter = meterFromHeaders(res.headers, now());
145
+ switch (res.status) {
146
+ case 200:
147
+ return { result: { kind: "measured", meter }, modelMissing: false };
148
+ case 429:
149
+ // Without status=rejected it is a short burst limit, not the account's quota.
150
+ return meter.rejected
151
+ ? { result: { kind: "measured", meter }, modelMissing: false }
152
+ : { result: { kind: "unmeasured", reason: "briefly rate limited" }, modelMissing: false };
153
+ case 401:
154
+ case 403:
155
+ return { result: { kind: "refused", reason: message }, modelMissing: false };
156
+ case 400:
157
+ case 404: {
158
+ const modelMissing = error?.type === "not_found_error" || message.toLowerCase().includes("model");
159
+ return { result: { kind: "unmeasured", reason: modelMissing ? `model ${model} unavailable` : message }, modelMissing };
160
+ }
161
+ default:
162
+ return { result: { kind: "unmeasured", reason: message }, modelMissing: false };
163
+ }
164
+ }
165
+ /** Measure one account: the first probe model that exists answers. */
166
+ export async function probeAccount(token, opts = {}) {
167
+ const fetchImpl = opts.fetchImpl ?? fetch;
168
+ const now = opts.now ?? Date.now;
169
+ let last = { kind: "unmeasured", reason: "no probe model answered" };
170
+ for (const m of opts.models ?? PROBE_MODELS) {
171
+ const { result, modelMissing } = await probeOnce(token, m, fetchImpl, now);
172
+ if (!modelMissing)
173
+ return result;
174
+ last = result;
175
+ }
176
+ return last;
177
+ }
178
+ // ─── standing + selection ─────────────────────────────────────────────────────
179
+ /** An account counts as full once its 5-hour or weekly window reaches this percent. */
180
+ export const FULL_AT_PERCENT = 95;
181
+ /** A measurement is reused this long before the account is measured again. */
182
+ export const MEASURE_TTL_MS = 3 * 60_000;
183
+ export function isFull(m, threshold = FULL_AT_PERCENT) {
184
+ return m.rejected || (m.fiveHour ?? 0) >= threshold || (m.week ?? 0) >= threshold;
185
+ }
186
+ /** When the window that makes it full resets; a quarter of an hour when the server gave no time. */
187
+ export function fullUntil(m, threshold = FULL_AT_PERCENT) {
188
+ const dates = [];
189
+ if ((m.week ?? 0) >= threshold && m.weekReset)
190
+ dates.push(m.weekReset);
191
+ if ((m.fiveHour ?? 0) >= threshold && m.fiveHourReset)
192
+ dates.push(m.fiveHourReset);
193
+ if (!dates.length && m.rejected) {
194
+ const r = m.reset ?? m.fiveHourReset ?? m.weekReset;
195
+ if (r)
196
+ dates.push(r);
197
+ }
198
+ return dates.length ? Math.max(...dates) : m.checkedAt + 15 * 60_000;
199
+ }
200
+ /**
201
+ * What one account can take now, from its last probe and any "full until"
202
+ * mark a run left on it (a run that ended on a usage limit). A full window
203
+ * whose reset has passed is UNMEASURED until it is measured again — never room.
204
+ */
205
+ export function standingOf(probe, markedFullUntil, now, threshold = FULL_AT_PERCENT) {
206
+ if (markedFullUntil !== undefined && markedFullUntil > now) {
207
+ return { kind: "full", until: markedFullUntil, ...(probe?.kind === "measured" ? { meter: probe.meter } : {}) };
208
+ }
209
+ if (!probe)
210
+ return { kind: "unmeasured", reason: "not measured yet" };
211
+ if (probe.kind === "refused")
212
+ return { kind: "refused", reason: probe.reason };
213
+ if (probe.kind === "unmeasured")
214
+ return { kind: "unmeasured", reason: probe.reason };
215
+ const m = probe.meter;
216
+ if (isFull(m, threshold)) {
217
+ const until = fullUntil(m, threshold);
218
+ return until > now ? { kind: "full", until, meter: m } : { kind: "unmeasured", reason: "full window has reset; not measured since" };
219
+ }
220
+ return { kind: "room", meter: m };
221
+ }
222
+ /** Weekly room left in percent, when the account was measured. */
223
+ function weeklyLeft(s) {
224
+ const m = s.kind === "room" || s.kind === "full" ? s.meter : undefined;
225
+ if (!m || m.week === undefined)
226
+ return undefined;
227
+ return 100 - m.week;
228
+ }
229
+ /**
230
+ * The reserve: the `reserve` NON-design accounts with the most weekly room
231
+ * left — kept for the person's own morning. Only MEASURED accounts are ranked
232
+ * (an unmeasured one cannot be launched on anyway); a measured account whose
233
+ * weekly figure is missing ranks last. Ties go to file order.
234
+ */
235
+ export function reserveIds(accounts, standings, reserve) {
236
+ if (reserve <= 0)
237
+ return new Set();
238
+ const ranked = accounts
239
+ .map((a, order) => ({ a, order, s: standings.get(a.id) }))
240
+ .filter((x) => !x.a.design && x.s && (x.s.kind === "room" || x.s.kind === "full"))
241
+ .map((x) => ({ ...x, left: weeklyLeft(x.s) }))
242
+ .sort((x, y) => (y.left ?? -Infinity) - (x.left ?? -Infinity) || x.order - y.order);
243
+ return new Set(ranked.slice(0, reserve).map((x) => x.a.id));
244
+ }
245
+ /**
246
+ * Pick the account a run launches on.
247
+ *
248
+ * - A DESIGN run: only an account flagged `design` (the artifact belongs to
249
+ * the publishing account). None with room ⇒ nothing: wait, never another one.
250
+ * - Any other run: leave out the reserve; among the rest with room, the one
251
+ * whose 5-hour window resets SOONEST (use it or lose it); ties → file order.
252
+ * A design account comes last: it is spent on other runs only when no other
253
+ * account has room, so its quota stays for the designs only it can publish.
254
+ * An unmeasured, refused or full account is never picked.
255
+ */
256
+ export function selectAccount(file, standings, opts) {
257
+ const pool = opts.design
258
+ ? file.accounts.filter((a) => a.design)
259
+ : (() => {
260
+ const reserved = reserveIds(file.accounts, standings, file.reserve);
261
+ return file.accounts.filter((a) => !reserved.has(a.id));
262
+ })();
263
+ if (opts.design && pool.length === 0)
264
+ return { reason: "no account is flagged design:true" };
265
+ const withRoom = pool
266
+ .map((a, order) => ({ a, order, s: standings.get(a.id) }))
267
+ .filter((x) => x.s?.kind === "room");
268
+ if (!withRoom.length) {
269
+ const why = pool.map((a) => `${a.id}: ${describeStanding(standings.get(a.id))}`).join(", ");
270
+ return { reason: `no ${opts.design ? "design " : ""}account with room (${why || "all reserved"})` };
271
+ }
272
+ withRoom.sort((x, y) => (opts.design ? 0 : Number(!!x.a.design) - Number(!!y.a.design)) ||
273
+ (x.s.meter.fiveHourReset ?? Infinity) - (y.s.meter.fiveHourReset ?? Infinity) ||
274
+ x.order - y.order);
275
+ return { account: withRoom[0].a };
276
+ }
277
+ export function describeStanding(s) {
278
+ if (!s)
279
+ return "not measured";
280
+ switch (s.kind) {
281
+ case "room":
282
+ return `room (5h ${Math.round(s.meter.fiveHour ?? 0)}%, 7d ${Math.round(s.meter.week ?? 0)}%)`;
283
+ case "full":
284
+ return `full until ${new Date(s.until).toISOString()}`;
285
+ case "refused":
286
+ return "token refused";
287
+ case "unmeasured":
288
+ return `unmeasured (${s.reason})`;
289
+ }
290
+ }
291
+ // ─── the pool: cache + marks ──────────────────────────────────────────────────
292
+ /**
293
+ * The accounts plus what the worker knows about each: the last probe (reused
294
+ * for MEASURE_TTL_MS) and a "full until" mark left by a run that ended on a
295
+ * usage limit. In memory only: a restart measures again.
296
+ */
297
+ export class AccountPool {
298
+ file;
299
+ probe;
300
+ now;
301
+ probes = new Map();
302
+ marks = new Map();
303
+ constructor(file, probe, now = Date.now) {
304
+ this.file = file;
305
+ this.probe = probe;
306
+ this.now = now;
307
+ }
308
+ byId(id) {
309
+ return id ? this.file.accounts.find((a) => a.id === id) : undefined;
310
+ }
311
+ /** Measure every account whose measurement is stale (in parallel), skipping marked-full ones. */
312
+ async measure() {
313
+ const t = this.now();
314
+ await Promise.all(this.file.accounts.map(async (a) => {
315
+ const mark = this.marks.get(a.id);
316
+ if (mark !== undefined && mark > t)
317
+ return;
318
+ const last = this.probes.get(a.id);
319
+ const fresh = last?.kind === "measured" && t - last.meter.checkedAt < MEASURE_TTL_MS && !(isFull(last.meter) && fullUntil(last.meter) <= t);
320
+ if (fresh)
321
+ return;
322
+ this.probes.set(a.id, await this.probe(a.token));
323
+ }));
324
+ return this.standings();
325
+ }
326
+ standings() {
327
+ const t = this.now();
328
+ return new Map(this.file.accounts.map((a) => [a.id, standingOf(this.probes.get(a.id), this.marks.get(a.id), t)]));
329
+ }
330
+ /** A run on this account ended on a usage limit: full until then, measured afresh after. */
331
+ markFull(id, until) {
332
+ this.marks.set(id, until);
333
+ this.probes.delete(id);
334
+ }
335
+ select(opts) {
336
+ return selectAccount(this.file, this.standings(), opts);
337
+ }
338
+ }
339
+ //# sourceMappingURL=worker-accounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-accounts.js","sourceRoot":"","sources":["../../src/commands/worker-accounts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};