@cluesmith/codev 3.3.5 → 3.3.7

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 (247) hide show
  1. package/dashboard-dist/assets/{index-r3bZzLmX.css → index-BjcqV9Vv.css} +1 -1
  2. package/dashboard-dist/assets/{index-BuflRUi6.js → index-b7GnZV2i.js} +55 -55
  3. package/dashboard-dist/assets/index-b7GnZV2i.js.map +1 -0
  4. package/dashboard-dist/index.html +2 -2
  5. package/dist/agent-farm/cli.d.ts.map +1 -1
  6. package/dist/agent-farm/cli.js +50 -17
  7. package/dist/agent-farm/cli.js.map +1 -1
  8. package/dist/agent-farm/commands/architect.d.ts.map +1 -1
  9. package/dist/agent-farm/commands/architect.js +5 -1
  10. package/dist/agent-farm/commands/architect.js.map +1 -1
  11. package/dist/agent-farm/commands/attach.d.ts +1 -1
  12. package/dist/agent-farm/commands/attach.d.ts.map +1 -1
  13. package/dist/agent-farm/commands/cleanup.d.ts +1 -1
  14. package/dist/agent-farm/commands/cleanup.d.ts.map +1 -1
  15. package/dist/agent-farm/commands/cleanup.js +2 -1
  16. package/dist/agent-farm/commands/cleanup.js.map +1 -1
  17. package/dist/agent-farm/commands/decisions.d.ts +25 -0
  18. package/dist/agent-farm/commands/decisions.d.ts.map +1 -0
  19. package/dist/agent-farm/commands/decisions.js +54 -0
  20. package/dist/agent-farm/commands/decisions.js.map +1 -0
  21. package/dist/agent-farm/commands/ide.d.ts +32 -3
  22. package/dist/agent-farm/commands/ide.d.ts.map +1 -1
  23. package/dist/agent-farm/commands/ide.js +180 -19
  24. package/dist/agent-farm/commands/ide.js.map +1 -1
  25. package/dist/agent-farm/commands/reset/context.d.ts +4 -2
  26. package/dist/agent-farm/commands/reset/context.d.ts.map +1 -1
  27. package/dist/agent-farm/commands/reset/context.js +12 -4
  28. package/dist/agent-farm/commands/reset/context.js.map +1 -1
  29. package/dist/agent-farm/commands/send.d.ts.map +1 -1
  30. package/dist/agent-farm/commands/send.js +13 -18
  31. package/dist/agent-farm/commands/send.js.map +1 -1
  32. package/dist/agent-farm/commands/spawn-worktree.d.ts +7 -0
  33. package/dist/agent-farm/commands/spawn-worktree.d.ts.map +1 -1
  34. package/dist/agent-farm/commands/spawn-worktree.js +51 -18
  35. package/dist/agent-farm/commands/spawn-worktree.js.map +1 -1
  36. package/dist/agent-farm/commands/spawn.d.ts +17 -0
  37. package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
  38. package/dist/agent-farm/commands/spawn.js +41 -19
  39. package/dist/agent-farm/commands/spawn.js.map +1 -1
  40. package/dist/agent-farm/lib/builder-lookup.d.ts +3 -2
  41. package/dist/agent-farm/lib/builder-lookup.d.ts.map +1 -1
  42. package/dist/agent-farm/lib/builder-lookup.js +24 -9
  43. package/dist/agent-farm/lib/builder-lookup.js.map +1 -1
  44. package/dist/agent-farm/lib/ide-extensions.d.ts +82 -0
  45. package/dist/agent-farm/lib/ide-extensions.d.ts.map +1 -0
  46. package/dist/agent-farm/lib/ide-extensions.js +179 -0
  47. package/dist/agent-farm/lib/ide-extensions.js.map +1 -0
  48. package/dist/agent-farm/lib/ide-prefix.d.ts +10 -0
  49. package/dist/agent-farm/lib/ide-prefix.d.ts.map +1 -0
  50. package/dist/agent-farm/lib/ide-prefix.js +13 -0
  51. package/dist/agent-farm/lib/ide-prefix.js.map +1 -0
  52. package/dist/agent-farm/lib/ide-record.d.ts +20 -3
  53. package/dist/agent-farm/lib/ide-record.d.ts.map +1 -1
  54. package/dist/agent-farm/lib/ide-record.js +34 -3
  55. package/dist/agent-farm/lib/ide-record.js.map +1 -1
  56. package/dist/agent-farm/lib/ide-version.d.ts +97 -0
  57. package/dist/agent-farm/lib/ide-version.d.ts.map +1 -0
  58. package/dist/agent-farm/lib/ide-version.js +224 -0
  59. package/dist/agent-farm/lib/ide-version.js.map +1 -0
  60. package/dist/agent-farm/lib/tunnel-client.d.ts.map +1 -1
  61. package/dist/agent-farm/lib/tunnel-client.js +7 -3
  62. package/dist/agent-farm/lib/tunnel-client.js.map +1 -1
  63. package/dist/agent-farm/servers/agent-state/broadcast.d.ts +19 -0
  64. package/dist/agent-farm/servers/agent-state/broadcast.d.ts.map +1 -0
  65. package/dist/agent-farm/servers/agent-state/broadcast.js +30 -0
  66. package/dist/agent-farm/servers/agent-state/broadcast.js.map +1 -0
  67. package/dist/agent-farm/servers/agent-state/identity.d.ts +50 -0
  68. package/dist/agent-farm/servers/agent-state/identity.d.ts.map +1 -0
  69. package/dist/agent-farm/servers/agent-state/identity.js +120 -0
  70. package/dist/agent-farm/servers/agent-state/identity.js.map +1 -0
  71. package/dist/agent-farm/servers/agent-state/liveness.d.ts +107 -0
  72. package/dist/agent-farm/servers/agent-state/liveness.d.ts.map +1 -0
  73. package/dist/agent-farm/servers/agent-state/liveness.js +224 -0
  74. package/dist/agent-farm/servers/agent-state/liveness.js.map +1 -0
  75. package/dist/agent-farm/servers/agent-state/route.d.ts +38 -0
  76. package/dist/agent-farm/servers/agent-state/route.d.ts.map +1 -0
  77. package/dist/agent-farm/servers/agent-state/route.js +170 -0
  78. package/dist/agent-farm/servers/agent-state/route.js.map +1 -0
  79. package/dist/agent-farm/servers/agent-state/serve.d.ts +31 -0
  80. package/dist/agent-farm/servers/agent-state/serve.d.ts.map +1 -0
  81. package/dist/agent-farm/servers/agent-state/serve.js +49 -0
  82. package/dist/agent-farm/servers/agent-state/serve.js.map +1 -0
  83. package/dist/agent-farm/servers/agent-state/store.d.ts +76 -0
  84. package/dist/agent-farm/servers/agent-state/store.d.ts.map +1 -0
  85. package/dist/agent-farm/servers/agent-state/store.js +157 -0
  86. package/dist/agent-farm/servers/agent-state/store.js.map +1 -0
  87. package/dist/agent-farm/servers/decisions/parse.d.ts.map +1 -1
  88. package/dist/agent-farm/servers/decisions/parse.js +45 -15
  89. package/dist/agent-farm/servers/decisions/parse.js.map +1 -1
  90. package/dist/agent-farm/servers/decisions/stamp.d.ts +6 -2
  91. package/dist/agent-farm/servers/decisions/stamp.d.ts.map +1 -1
  92. package/dist/agent-farm/servers/decisions/stamp.js +53 -29
  93. package/dist/agent-farm/servers/decisions/stamp.js.map +1 -1
  94. package/dist/agent-farm/servers/decisions/template.d.ts +2 -0
  95. package/dist/agent-farm/servers/decisions/template.d.ts.map +1 -0
  96. package/dist/agent-farm/servers/decisions/template.js +15 -0
  97. package/dist/agent-farm/servers/decisions/template.js.map +1 -0
  98. package/dist/agent-farm/servers/ide-forward.d.ts +57 -5
  99. package/dist/agent-farm/servers/ide-forward.d.ts.map +1 -1
  100. package/dist/agent-farm/servers/ide-forward.js +263 -31
  101. package/dist/agent-farm/servers/ide-forward.js.map +1 -1
  102. package/dist/agent-farm/servers/ide-server.d.ts +28 -8
  103. package/dist/agent-farm/servers/ide-server.d.ts.map +1 -1
  104. package/dist/agent-farm/servers/ide-server.js +151 -52
  105. package/dist/agent-farm/servers/ide-server.js.map +1 -1
  106. package/dist/agent-farm/servers/overview.d.ts +27 -1
  107. package/dist/agent-farm/servers/overview.d.ts.map +1 -1
  108. package/dist/agent-farm/servers/overview.js +184 -31
  109. package/dist/agent-farm/servers/overview.js.map +1 -1
  110. package/dist/agent-farm/servers/tower-instances.d.ts +14 -1
  111. package/dist/agent-farm/servers/tower-instances.d.ts.map +1 -1
  112. package/dist/agent-farm/servers/tower-instances.js +51 -9
  113. package/dist/agent-farm/servers/tower-instances.js.map +1 -1
  114. package/dist/agent-farm/servers/tower-routes.d.ts.map +1 -1
  115. package/dist/agent-farm/servers/tower-routes.js +149 -15
  116. package/dist/agent-farm/servers/tower-routes.js.map +1 -1
  117. package/dist/agent-farm/servers/tower-server.js +35 -1
  118. package/dist/agent-farm/servers/tower-server.js.map +1 -1
  119. package/dist/agent-farm/servers/tower-terminals.d.ts +25 -0
  120. package/dist/agent-farm/servers/tower-terminals.d.ts.map +1 -1
  121. package/dist/agent-farm/servers/tower-terminals.js +128 -4
  122. package/dist/agent-farm/servers/tower-terminals.js.map +1 -1
  123. package/dist/agent-farm/servers/tower-utils.d.ts.map +1 -1
  124. package/dist/agent-farm/servers/tower-utils.js +18 -5
  125. package/dist/agent-farm/servers/tower-utils.js.map +1 -1
  126. package/dist/agent-farm/servers/tower-websocket.d.ts.map +1 -1
  127. package/dist/agent-farm/servers/tower-websocket.js +11 -7
  128. package/dist/agent-farm/servers/tower-websocket.js.map +1 -1
  129. package/dist/agent-farm/utils/builder-worktree-identity.d.ts +39 -0
  130. package/dist/agent-farm/utils/builder-worktree-identity.d.ts.map +1 -0
  131. package/dist/agent-farm/utils/builder-worktree-identity.js +42 -0
  132. package/dist/agent-farm/utils/builder-worktree-identity.js.map +1 -0
  133. package/dist/agent-farm/utils/harness.d.ts +71 -0
  134. package/dist/agent-farm/utils/harness.d.ts.map +1 -1
  135. package/dist/agent-farm/utils/harness.js +153 -0
  136. package/dist/agent-farm/utils/harness.js.map +1 -1
  137. package/dist/agent-farm/utils/lifecycle-reporter.d.ts +79 -0
  138. package/dist/agent-farm/utils/lifecycle-reporter.d.ts.map +1 -0
  139. package/dist/agent-farm/utils/lifecycle-reporter.js +347 -0
  140. package/dist/agent-farm/utils/lifecycle-reporter.js.map +1 -0
  141. package/dist/agent-farm/utils/server-utils.d.ts +54 -19
  142. package/dist/agent-farm/utils/server-utils.d.ts.map +1 -1
  143. package/dist/agent-farm/utils/server-utils.js +144 -27
  144. package/dist/agent-farm/utils/server-utils.js.map +1 -1
  145. package/dist/cli.d.ts.map +1 -1
  146. package/dist/cli.js +17 -0
  147. package/dist/cli.js.map +1 -1
  148. package/dist/commands/adopt.d.ts +16 -2
  149. package/dist/commands/adopt.d.ts.map +1 -1
  150. package/dist/commands/adopt.js +67 -23
  151. package/dist/commands/adopt.js.map +1 -1
  152. package/dist/commands/bootstrap-docs.d.ts +132 -0
  153. package/dist/commands/bootstrap-docs.d.ts.map +1 -0
  154. package/dist/commands/bootstrap-docs.js +725 -0
  155. package/dist/commands/bootstrap-docs.js.map +1 -0
  156. package/dist/commands/consult/index.d.ts.map +1 -1
  157. package/dist/commands/consult/index.js +14 -1
  158. package/dist/commands/consult/index.js.map +1 -1
  159. package/dist/commands/consult/tree-tripwire.d.ts +2 -75
  160. package/dist/commands/consult/tree-tripwire.d.ts.map +1 -1
  161. package/dist/commands/consult/tree-tripwire.js +7 -184
  162. package/dist/commands/consult/tree-tripwire.js.map +1 -1
  163. package/dist/commands/doctor.d.ts.map +1 -1
  164. package/dist/commands/doctor.js +36 -4
  165. package/dist/commands/doctor.js.map +1 -1
  166. package/dist/commands/porch/state.d.ts +0 -4
  167. package/dist/commands/porch/state.d.ts.map +1 -1
  168. package/dist/commands/porch/state.js +23 -10
  169. package/dist/commands/porch/state.js.map +1 -1
  170. package/dist/commands/update.d.ts +5 -1
  171. package/dist/commands/update.d.ts.map +1 -1
  172. package/dist/commands/update.js +73 -18
  173. package/dist/commands/update.js.map +1 -1
  174. package/dist/lib/agent-env.d.ts +22 -1
  175. package/dist/lib/agent-env.d.ts.map +1 -1
  176. package/dist/lib/agent-env.js +27 -1
  177. package/dist/lib/agent-env.js.map +1 -1
  178. package/dist/lib/agent-process.d.ts +23 -0
  179. package/dist/lib/agent-process.d.ts.map +1 -0
  180. package/dist/lib/agent-process.js +24 -0
  181. package/dist/lib/agent-process.js.map +1 -0
  182. package/dist/lib/forge-contracts.d.ts +9 -3
  183. package/dist/lib/forge-contracts.d.ts.map +1 -1
  184. package/dist/lib/forge-contracts.js.map +1 -1
  185. package/dist/lib/forge.d.ts +8 -5
  186. package/dist/lib/forge.d.ts.map +1 -1
  187. package/dist/lib/forge.js +57 -1
  188. package/dist/lib/forge.js.map +1 -1
  189. package/dist/lib/github.d.ts.map +1 -1
  190. package/dist/lib/github.js +38 -0
  191. package/dist/lib/github.js.map +1 -1
  192. package/dist/lib/governance-bootstrap.d.ts +155 -0
  193. package/dist/lib/governance-bootstrap.d.ts.map +1 -0
  194. package/dist/lib/governance-bootstrap.js +469 -0
  195. package/dist/lib/governance-bootstrap.js.map +1 -0
  196. package/dist/lib/issue-id.d.ts +34 -0
  197. package/dist/lib/issue-id.d.ts.map +1 -0
  198. package/dist/lib/issue-id.js +61 -0
  199. package/dist/lib/issue-id.js.map +1 -0
  200. package/dist/lib/scaffold.d.ts +4 -0
  201. package/dist/lib/scaffold.d.ts.map +1 -1
  202. package/dist/lib/scaffold.js +29 -5
  203. package/dist/lib/scaffold.js.map +1 -1
  204. package/dist/lib/shipped-skill-hashes.d.ts +10 -0
  205. package/dist/lib/shipped-skill-hashes.d.ts.map +1 -0
  206. package/dist/lib/shipped-skill-hashes.js +197 -0
  207. package/dist/lib/shipped-skill-hashes.js.map +1 -0
  208. package/dist/lib/skill-refresh.d.ts +90 -0
  209. package/dist/lib/skill-refresh.d.ts.map +1 -0
  210. package/dist/lib/skill-refresh.js +267 -0
  211. package/dist/lib/skill-refresh.js.map +1 -0
  212. package/dist/lib/tree-snapshot.d.ts +172 -0
  213. package/dist/lib/tree-snapshot.d.ts.map +1 -0
  214. package/dist/lib/tree-snapshot.js +393 -0
  215. package/dist/lib/tree-snapshot.js.map +1 -0
  216. package/dist/terminal/pty-session.d.ts +5 -0
  217. package/dist/terminal/pty-session.d.ts.map +1 -1
  218. package/dist/terminal/pty-session.js +7 -0
  219. package/dist/terminal/pty-session.js.map +1 -1
  220. package/ide-extension/codev-vscode.vsix +0 -0
  221. package/ide-extension/manifest.json +7 -0
  222. package/package.json +8 -6
  223. package/scripts/forge/jira/_lib.sh +113 -0
  224. package/scripts/forge/jira/auth-status.sh +29 -0
  225. package/scripts/forge/jira/issue-comment.sh +23 -0
  226. package/scripts/forge/jira/issue-list.sh +32 -0
  227. package/scripts/forge/jira/issue-search.sh +40 -0
  228. package/scripts/forge/jira/issue-view.sh +41 -0
  229. package/scripts/forge/jira/recently-closed.sh +81 -0
  230. package/scripts/forge/jira/user-identity.sh +18 -0
  231. package/skeleton/.claude/skills/afx/SKILL.md +36 -0
  232. package/skeleton/.claude/skills/codev/SKILL.md +18 -2
  233. package/skeleton/.claude/skills/update-arch-docs/SKILL.md +28 -2
  234. package/skeleton/.codex/skills/afx/SKILL.md +36 -0
  235. package/skeleton/.codex/skills/codev/SKILL.md +18 -2
  236. package/skeleton/.codex/skills/update-arch-docs/SKILL.md +28 -2
  237. package/skeleton/resources/commands/agent-farm.md +139 -0
  238. package/skeleton/resources/commands/codev.md +47 -0
  239. package/skeleton/resources/commands/overview.md +1 -0
  240. package/skeleton/resources/decision-protocol.md +215 -0
  241. package/skeleton/resources/workflow-reference.md +12 -0
  242. package/skeleton/roles/architect.md +6 -0
  243. package/skeleton/templates/bootstrap-docs-prompt.md +16 -0
  244. package/skeleton/templates/bootstrap-docs-review-prompt.md +19 -0
  245. package/skeleton/templates/cheatsheet.md +1 -0
  246. package/templates/tower.html +78 -3
  247. package/dashboard-dist/assets/index-BuflRUi6.js.map +0 -1
@@ -17,8 +17,9 @@ import { URL } from 'node:url';
17
17
  import { readCloudConfig } from '../lib/cloud-config.js';
18
18
  import { TUNNEL_PROXY_HEADER } from '../lib/tunnel-client.js';
19
19
  import { TOWER_KEY_HEADER, LEGACY_WEB_KEY_HEADER } from '@cluesmith/codev-types';
20
- import { IDE_DEFAULT_PREFIX, readIdeConnectionToken } from '../lib/ide-record.js';
20
+ import { IDE_DEFAULT_PREFIX, matchIdePrefix, readIdeConnectionToken } from '../lib/ide-record.js';
21
21
  import { getRecordedIdePort, ensureIdeServerLive } from './ide-server.js';
22
+ import { IDE_FORWARD_COOKIE } from '../utils/server-utils.js';
22
23
  /** Hop-by-hop headers not forwarded between connections (RFC 7230 §6.1). */
23
24
  const HOP_BY_HOP = new Set([
24
25
  'connection',
@@ -38,16 +39,31 @@ const HOP_BY_HOP = new Set([
38
39
  * server must never see it.
39
40
  * - `x-codev-tunnel-proxy`: Tower's tunnel marker — never forwarded, so it
40
41
  * cannot leak or be trusted downstream (marker integrity, #1674).
42
+ * - `x-forwarded-host` / `-proto` / `-prefix`: only Tower's own stamps reach the
43
+ * IDE server (Issue #1869); a client copy could steer the workbench's
44
+ * `remoteAuthority` or base path.
41
45
  * - `host`: replaced with the loopback target authority below.
42
46
  */
43
47
  const STRIP_BEFORE_FORWARD = new Set([
44
48
  'x-forwarded-port',
45
49
  'x-original-host',
50
+ // Tower's own x-forwarded-* stamps are the only ones the IDE server may see
51
+ // (Issue #1869): client-supplied copies are dropped on every path.
52
+ 'x-forwarded-host',
53
+ 'x-forwarded-proto',
54
+ 'x-forwarded-prefix',
46
55
  TOWER_KEY_HEADER,
47
56
  LEGACY_WEB_KEY_HEADER,
48
57
  TUNNEL_PROXY_HEADER,
49
58
  'host',
50
59
  ]);
60
+ /**
61
+ * Response headers never relayed from the IDE server, on any path (Issue #1869):
62
+ * Tower must NEVER send `Access-Control-Allow-Credentials` (Tower reflects any
63
+ * loopback `Origin`, so with it another localhost page could read
64
+ * cookie-authorized `/ide` responses).
65
+ */
66
+ const STRIP_FROM_RESPONSE = new Set(['access-control-allow-credentials']);
51
67
  /** True if this request arrived over the tunnel (stamped by `TunnelClient`, #1588). */
52
68
  function isTunnelBorne(headers) {
53
69
  return headers[TUNNEL_PROXY_HEADER] === '1';
@@ -55,17 +71,38 @@ function isTunnelBorne(headers) {
55
71
  /** The connection-token cookie name the VS Code server reads. */
56
72
  const IDE_TOKEN_COOKIE = 'vscode-tkn';
57
73
  /**
58
- * Merge the IDE connection token into a Cookie header value as `vscode-tkn=…`,
59
- * preserving every existing cookie and never clobbering an already-present
60
- * `vscode-tkn` (Issue #1668). Exported for testing.
74
+ * Set the IDE connection token in a Cookie header value as `vscode-tkn=…`,
75
+ * preserving every other cookie. Tower's token REPLACES any incoming
76
+ * `vscode-tkn` (Issue #1869): Tower is the sole legitimate source, so a
77
+ * browser-held copy (a hand-built `?tkn=` URL, a pre-fix session, a token
78
+ * stale after rotation) is never authoritative. Exported for testing.
61
79
  */
62
80
  export function mergeConnectionTokenCookie(existing, token) {
63
- const current = Array.isArray(existing) ? existing.join('; ') : existing ?? '';
64
- // Never clobber: if a vscode-tkn is already present, leave the header as-is.
65
- if (new RegExp(`(^|;\\s*)${IDE_TOKEN_COOKIE}=`).test(current))
66
- return current;
81
+ const others = stripCookie(existing, IDE_TOKEN_COOKIE);
67
82
  const pair = `${IDE_TOKEN_COOKIE}=${token}`;
68
- return current ? `${current}; ${pair}` : pair;
83
+ return others ? `${others}; ${pair}` : pair;
84
+ }
85
+ /**
86
+ * Remove one cookie (exact name) from a Cookie header value, preserving every
87
+ * other pair in order. Accepts the string | string[] shape. Returns '' when no
88
+ * pair remains. Used to keep Tower's forward cookie (Issue #1869) away from the
89
+ * IDE server, the way the key header is stripped. Exported for testing.
90
+ */
91
+ export function stripCookie(existing, name) {
92
+ if (existing === undefined)
93
+ return '';
94
+ const joined = Array.isArray(existing) ? existing.join('; ') : existing;
95
+ return joined
96
+ .split(';')
97
+ .map((pair) => pair.trim())
98
+ .filter((pair) => {
99
+ if (pair.length === 0)
100
+ return false;
101
+ const eq = pair.indexOf('=');
102
+ const pairName = eq < 0 ? pair : pair.slice(0, eq).trim();
103
+ return pairName !== name;
104
+ })
105
+ .join('; ');
69
106
  }
70
107
  /**
71
108
  * Derive the tunnel's public authority from the cloud config, matching the
@@ -111,38 +148,216 @@ export function buildForwardHeaders(incoming, port, publicAuthority, connectionT
111
148
  out[key] = value;
112
149
  }
113
150
  out['host'] = `127.0.0.1:${port}`;
114
- if (isTunnelBorne(incoming) && publicAuthority) {
115
- out['x-forwarded-host'] = publicAuthority.host;
116
- out['x-forwarded-proto'] = publicAuthority.proto;
117
- out['x-forwarded-prefix'] = publicAuthority.prefix;
151
+ if (isTunnelBorne(incoming)) {
152
+ if (publicAuthority) {
153
+ out['x-forwarded-host'] = publicAuthority.host;
154
+ out['x-forwarded-proto'] = publicAuthority.proto;
155
+ out['x-forwarded-prefix'] = publicAuthority.prefix;
156
+ }
157
+ }
158
+ else if (typeof incoming.host === 'string' && incoming.host.length > 0) {
159
+ // Local browser (Issue #1869): the IDE server builds the workbench's
160
+ // `remoteAuthority` from the Host it sees, and the rewrite above makes that
161
+ // its own port, so the workbench would dial the IDE server directly and
162
+ // bypass Tower's forward seam. Stamp Tower's own authority (the incoming
163
+ // Host, already Host-guarded) so the workbench's sockets and remote
164
+ // resources come back through Tower. No prefix: locally `/ide` IS the
165
+ // server's base path.
166
+ out['x-forwarded-host'] = incoming.host;
167
+ out['x-forwarded-proto'] = 'http';
118
168
  }
119
169
  // Present the IDE server's connection token as a cookie. The server is
120
- // spawned with `--connection-token-file` and 403s without it, and it cannot
121
- // ride the browser's cookie jar through the relay (Set-Cookie Path=/ide never
122
- // matches /t/<tower>/ide/), so Tower injects it here — merging with, never
123
- // clobbering, any existing Cookie header (Issue #1668).
170
+ // spawned with `--connection-token-file` and 403s without it, and the
171
+ // browser never holds the token (Tower strips the server's Set-Cookie,
172
+ // Issue #1869), so Tower injects it here on every request (Issue #1668),
173
+ // REPLACING any browser-held `vscode-tkn` and keeping every other cookie.
174
+ // Tower's own forward cookie is stripped first: the IDE server must never
175
+ // see it (Issue #1869).
176
+ const cookie = stripCookie(incoming.cookie, IDE_FORWARD_COOKIE);
177
+ delete out['cookie'];
124
178
  if (connectionToken) {
125
- out['cookie'] = mergeConnectionTokenCookie(incoming.cookie, connectionToken);
179
+ out['cookie'] = mergeConnectionTokenCookie(cookie, connectionToken);
180
+ }
181
+ else if (cookie) {
182
+ out['cookie'] = cookie;
126
183
  }
127
184
  return out;
128
185
  }
129
- /** True if `pathname` targets the IDE forward prefix (`/ide` or `/ide/…`). */
130
- export function matchIdePrefix(pathname) {
131
- const bare = IDE_DEFAULT_PREFIX.replace(/\/$/, ''); // "/ide"
132
- return pathname === bare || pathname.startsWith(IDE_DEFAULT_PREFIX);
186
+ /** True if `pathname` targets the IDE forward prefix; defined beside the prefix constant. */
187
+ export { matchIdePrefix };
188
+ /**
189
+ * Drop every `vscode-tkn` cookie the IDE server tries to set in the browser
190
+ * (Issue #1869). The server answers an authenticated request with
191
+ * `Set-Cookie: vscode-tkn=<connection token>` (7 days, SameSite=Lax); cookies
192
+ * are not port-scoped, so a browser holding it could open the remote protocol
193
+ * on the IDE server's own port from any localhost page, bypassing Tower. Tower
194
+ * injects the token on every forwarded request, so the browser never needs it.
195
+ * Returns undefined when nothing remains. Exported for testing.
196
+ */
197
+ export function stripConnectionTokenSetCookie(value) {
198
+ if (value === undefined)
199
+ return undefined;
200
+ const entries = Array.isArray(value) ? value : [value];
201
+ const kept = entries.filter((entry) => !new RegExp(`^\\s*${IDE_TOKEN_COOKIE}=`).test(entry));
202
+ return kept.length > 0 ? kept : undefined;
133
203
  }
134
- /** Copy response headers, dropping hop-by-hop; preserves `Cache-Control` / `ETag`. */
135
- function copyResponseHeaders(headers) {
204
+ /**
205
+ * Copy response headers, dropping hop-by-hop; preserves `Cache-Control` /
206
+ * `ETag`. With `stripTokenCookie` (a LOCAL request, Issue #1869) it also drops
207
+ * the IDE server's `vscode-tkn` Set-Cookie; the tunnel path relays it unchanged
208
+ * (the cloud variant is a separate follow-up). Exported for testing.
209
+ */
210
+ export function copyResponseHeaders(headers, stripTokenCookie) {
136
211
  const out = {};
137
212
  for (const [key, value] of Object.entries(headers)) {
138
213
  if (value === undefined)
139
214
  continue;
140
- if (HOP_BY_HOP.has(key.toLowerCase()))
215
+ const lower = key.toLowerCase();
216
+ if (HOP_BY_HOP.has(lower))
217
+ continue;
218
+ if (STRIP_FROM_RESPONSE.has(lower))
219
+ continue;
220
+ if (stripTokenCookie && lower === 'set-cookie') {
221
+ const kept = stripConnectionTokenSetCookie(value);
222
+ if (kept)
223
+ out[key] = kept;
141
224
  continue;
225
+ }
142
226
  out[key] = value;
143
227
  }
144
228
  return out;
145
229
  }
230
+ /** Opening of the workbench configuration the IDE server embeds in its page. */
231
+ const WORKBENCH_CONFIG_OPEN = '<meta id="vscode-workbench-web-configuration" data-settings="{';
232
+ /** Largest workbench page Tower will buffer to rewrite; anything bigger streams unchanged. */
233
+ export const MAX_WORKBENCH_HTML_BYTES = 2 * 1024 * 1024;
234
+ /** Only a plain alphanumeric token is ever written into the page. */
235
+ const SAFE_TOKEN = /^[A-Za-z0-9-]+$/;
236
+ /** Decode the HTML character references the server uses in `data-settings`. */
237
+ function decodeAttribute(value) {
238
+ return value
239
+ .replace(/&#x([0-9a-fA-F]+);/g, (_m, hex) => String.fromCodePoint(parseInt(hex, 16)))
240
+ .replace(/&#(\d+);/g, (_m, dec) => String.fromCodePoint(parseInt(dec, 10)))
241
+ .replace(/&quot;/g, '"')
242
+ .replace(/&#39;|&apos;/g, "'")
243
+ .replace(/&lt;/g, '<')
244
+ .replace(/&gt;/g, '>')
245
+ .replace(/&amp;/g, '&');
246
+ }
247
+ /** The decoded `data-settings` JSON object, or null when it does not parse as one. */
248
+ function parseSettings(attribute) {
249
+ try {
250
+ const parsed = JSON.parse(decodeAttribute(attribute));
251
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed))
252
+ return null;
253
+ return parsed;
254
+ }
255
+ catch {
256
+ return null;
257
+ }
258
+ }
259
+ /**
260
+ * Hand the workbench its connection token through its own configuration
261
+ * instead of the browser cookie jar (Issue #1869). The workbench takes
262
+ * `connectionToken` from its configuration first and falls back to the
263
+ * `vscode-tkn` cookie, which Tower strips locally because a cookie is readable
264
+ * by every localhost port. Same shape as Tower's same-origin key injection into
265
+ * the dashboard shell: post-auth only, never cross-origin readable.
266
+ *
267
+ * Inserts `"connectionToken":"<token>"` as the first key of the HTML-escaped
268
+ * JSON in `data-settings` (no trailing comma for an empty `{}`). Returns null,
269
+ * so the caller relays the page unchanged, when the token is not
270
+ * `^[A-Za-z0-9-]+$`, the page carries no workbench configuration, the
271
+ * configuration does not parse, it already names a `connectionToken`, or the
272
+ * rewritten configuration would not decode to valid JSON carrying the token.
273
+ * Exported for testing.
274
+ */
275
+ export function injectWorkbenchConnectionToken(html, token) {
276
+ if (!SAFE_TOKEN.test(token))
277
+ return null;
278
+ const start = html.indexOf(WORKBENCH_CONFIG_OPEN);
279
+ if (start < 0)
280
+ return null;
281
+ const valueStart = start + WORKBENCH_CONFIG_OPEN.length - 1; // at the "{"
282
+ const valueEnd = html.indexOf('"', valueStart);
283
+ if (valueEnd < 0)
284
+ return null;
285
+ const original = html.slice(valueStart, valueEnd);
286
+ const settings = parseSettings(original);
287
+ if (!settings || 'connectionToken' in settings)
288
+ return null;
289
+ const isEmpty = Object.keys(settings).length === 0;
290
+ const entry = `&quot;connectionToken&quot;:&quot;${token}&quot;`;
291
+ let rewritten = `{${entry},${original.slice(1)}`;
292
+ if (isEmpty)
293
+ rewritten = `{${entry}}`;
294
+ const check = parseSettings(rewritten);
295
+ if (!check || check.connectionToken !== token)
296
+ return null;
297
+ return html.slice(0, valueStart) + rewritten + html.slice(valueEnd);
298
+ }
299
+ /**
300
+ * True for a response Tower may rewrite: 200, uncompressed `text/html`, and not
301
+ * declared larger than the bound. Everything else streams unchanged.
302
+ */
303
+ function isRewritableWorkbenchPage(res) {
304
+ if (res.statusCode !== 200)
305
+ return false;
306
+ const type = res.headers['content-type'] ?? '';
307
+ if (!type.startsWith('text/html'))
308
+ return false;
309
+ if (res.headers['content-encoding'] !== undefined)
310
+ return false;
311
+ const declared = Number(res.headers['content-length']);
312
+ if (Number.isFinite(declared) && declared > MAX_WORKBENCH_HTML_BYTES)
313
+ return false;
314
+ return true;
315
+ }
316
+ /**
317
+ * Buffer a workbench page (up to the bound), inject the connection token, and
318
+ * relay it with a corrected Content-Length. A body that outgrows the bound
319
+ * mid-stream is relayed unchanged: the buffered bytes, then a pipe of the rest.
320
+ */
321
+ function relayWorkbenchHtml(proxyRes, res, token) {
322
+ const chunks = [];
323
+ let size = 0;
324
+ let streaming = false;
325
+ const onData = (chunk) => {
326
+ chunks.push(chunk);
327
+ size += chunk.length;
328
+ if (size <= MAX_WORKBENCH_HTML_BYTES)
329
+ return;
330
+ streaming = true;
331
+ proxyRes.off('data', onData);
332
+ res.writeHead(proxyRes.statusCode ?? 502, copyResponseHeaders(proxyRes.headers, true));
333
+ for (const buffered of chunks)
334
+ res.write(buffered);
335
+ proxyRes.pipe(res);
336
+ };
337
+ proxyRes.on('data', onData);
338
+ proxyRes.on('end', () => {
339
+ if (streaming)
340
+ return;
341
+ const original = Buffer.concat(chunks).toString('utf8');
342
+ const rewritten = injectWorkbenchConnectionToken(original, token);
343
+ const body = Buffer.from(rewritten ?? original, 'utf8');
344
+ const out = copyResponseHeaders(proxyRes.headers, true);
345
+ for (const key of Object.keys(out)) {
346
+ const lower = key.toLowerCase();
347
+ if (lower === 'content-length' || lower === 'transfer-encoding')
348
+ delete out[key];
349
+ }
350
+ out['content-length'] = body.length;
351
+ res.writeHead(proxyRes.statusCode ?? 502, out);
352
+ res.end(body);
353
+ });
354
+ proxyRes.on('error', () => {
355
+ if (!res.headersSent)
356
+ res.writeHead(502, { 'Content-Type': 'application/json' });
357
+ if (!res.writableEnded)
358
+ res.end();
359
+ });
360
+ }
146
361
  /**
147
362
  * Forward a plain HTTP request to the local IDE server. Assumes authorization
148
363
  * has already passed. Path and query are forwarded unchanged (the workbench
@@ -158,9 +373,17 @@ export async function forwardIdeHttp(req, res, log) {
158
373
  res.end(JSON.stringify({ error: 'IDE server unavailable' }));
159
374
  return;
160
375
  }
161
- const headers = buildForwardHeaders(req.headers, port, getPublicAuthority(), readIdeConnectionToken());
376
+ const connectionToken = readIdeConnectionToken();
377
+ const local = !isTunnelBorne(req.headers);
378
+ const headers = buildForwardHeaders(req.headers, port, getPublicAuthority(), connectionToken);
162
379
  const proxyReq = http.request({ hostname: '127.0.0.1', port, path: req.url || '/', method: req.method, headers }, (proxyRes) => {
163
- res.writeHead(proxyRes.statusCode ?? 502, copyResponseHeaders(proxyRes.headers));
380
+ // Local only (Issue #1869): the browser gets the token through the
381
+ // workbench configuration, never as a cookie. The tunnel path is unchanged.
382
+ if (local && connectionToken && isRewritableWorkbenchPage(proxyRes)) {
383
+ relayWorkbenchHtml(proxyRes, res, connectionToken);
384
+ return;
385
+ }
386
+ res.writeHead(proxyRes.statusCode ?? 502, copyResponseHeaders(proxyRes.headers, local));
164
387
  proxyRes.pipe(res);
165
388
  proxyRes.on('error', () => {
166
389
  if (!res.writableEnded)
@@ -221,7 +444,7 @@ export async function forwardIdeWebSocket(req, socket, head, log) {
221
444
  });
222
445
  upstream.on('upgrade', (_upstreamRes, upstreamSocket, upstreamHead) => {
223
446
  // Replay the handshake response and any buffered bytes, then pipe both ways.
224
- socket.write(rebuildUpgradeResponse(_upstreamRes));
447
+ socket.write(rebuildUpgradeResponse(_upstreamRes, !isTunnelBorne(req.headers)));
225
448
  if (upstreamHead.length > 0)
226
449
  socket.write(upstreamHead);
227
450
  if (head.length > 0)
@@ -254,11 +477,20 @@ export async function forwardIdeWebSocket(req, socket, head, log) {
254
477
  });
255
478
  upstream.end();
256
479
  }
257
- /** Reconstruct the HTTP/1.1 101 switching-protocols response line + headers. */
258
- function rebuildUpgradeResponse(res) {
480
+ /**
481
+ * Reconstruct the HTTP/1.1 101 switching-protocols response line + headers.
482
+ * With `stripTokenCookie` (a LOCAL request) it drops the IDE server's
483
+ * `vscode-tkn` Set-Cookie like the HTTP path does. Exported for testing.
484
+ */
485
+ export function rebuildUpgradeResponse(res, stripTokenCookie) {
259
486
  const statusLine = `HTTP/1.1 ${res.statusCode ?? 101} ${res.statusMessage ?? 'Switching Protocols'}`;
260
487
  const lines = [statusLine];
261
- for (const [key, value] of Object.entries(res.headers)) {
488
+ for (const [key, raw] of Object.entries(res.headers)) {
489
+ if (STRIP_FROM_RESPONSE.has(key.toLowerCase()))
490
+ continue;
491
+ let value = raw;
492
+ if (stripTokenCookie && key.toLowerCase() === 'set-cookie')
493
+ value = stripConnectionTokenSetCookie(raw);
262
494
  if (value === undefined)
263
495
  continue;
264
496
  if (Array.isArray(value)) {
@@ -1 +1 @@
1
- {"version":3,"file":"ide-forward.js","sourceRoot":"","sources":["../../../src/agent-farm/servers/ide-forward.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ide-forward.js","sourceRoot":"","sources":["../../../src/agent-farm/servers/ide-forward.ts"],"names":[],"mappings":"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"}
@@ -7,10 +7,18 @@
7
7
  * Runtime state lives in the `~/.agent-farm/ide-server.json` record (Issue
8
8
  * #1668 §D3) — no config file, no `global.db` change. Liveness is discovered by
9
9
  * port (`getProcessesOnPort`), the same way Tower finds its own process.
10
+ *
11
+ * Every spawn runs a preflight first (Spec 1789): the server version floor and
12
+ * the embedded sidebar install into the Tower-owned extensions directory. The
13
+ * preflight throws before anything is stopped, replaced or recorded, so a
14
+ * refused start leaves a live server and its record untouched. Lifecycle
15
+ * operations are serialized by `withIdeLock`, taken only at the entry points
16
+ * (`spawnIdeServer`, `stopIdeServer`, the respawn in `ensureIdeServerLive`);
17
+ * the unlocked bodies call each other freely, so the nesting cannot deadlock.
10
18
  */
11
19
  import http from 'node:http';
12
20
  import { type IdeServerRecord } from '../lib/ide-record.js';
13
- type LogFn = (level: 'INFO' | 'ERROR' | 'WARN', message: string) => void;
21
+ import { type LogFn } from '../lib/ide-version.js';
14
22
  /**
15
23
  * The recorded IDE server port, or null if none — the forward's hot-path target
16
24
  * resolution. A plain record read, no port scan (Issue #1668): a dead server
@@ -21,18 +29,31 @@ export declare function getRecordedIdePort(): number | null;
21
29
  export interface SpawnIdeOptions {
22
30
  serverPath: string;
23
31
  port?: number;
24
- defaultFolder?: string;
32
+ }
33
+ export interface SpawnIdeResult {
34
+ record: IdeServerRecord;
35
+ /**
36
+ * True when an already-live server was adopted that is not running what
37
+ * this start asked for: the sidebar just changed, the recorded server path,
38
+ * sidebar version or extensions directory differs from the current one
39
+ * (including a legacy record with neither), or its launch arguments are
40
+ * unknown (no prior record). The live server is never killed; the user
41
+ * restarts it.
42
+ */
43
+ restartRequired: boolean;
25
44
  }
26
45
  /**
27
46
  * Spawn the IDE server detached (so it survives a Tower restart, like a
28
- * shellper) and write the runtime record. Resolves to the record once the
29
- * server is listening, or throws if the binary is missing or never binds.
47
+ * shellper) and write the runtime record. Resolves once the server is
48
+ * listening, or throws if the binary is missing, fails the preflight, or never
49
+ * binds. Serialized with every other lifecycle operation.
30
50
  */
31
- export declare function spawnIdeServer(opts: SpawnIdeOptions, log: LogFn): Promise<IdeServerRecord>;
51
+ export declare function spawnIdeServer(opts: SpawnIdeOptions, log: LogFn): Promise<SpawnIdeResult>;
32
52
  /**
33
53
  * Stop the IDE server on the recorded port: SIGTERM, wait for exit, escalate to
34
54
  * SIGKILL for survivors (mirrors `towerStop`, #1668 plan §4), then delete the
35
- * record. Cold path — `getProcessesOnPort` is fine here.
55
+ * record. Cold path — `getProcessesOnPort` is fine here. Serialized with every
56
+ * other lifecycle operation.
36
57
  */
37
58
  export declare function stopIdeServer(log: LogFn): Promise<{
38
59
  stopped: boolean;
@@ -59,10 +80,9 @@ export declare function ensureIdeServerLive(log?: LogFn): Promise<number | null>
59
80
  export declare function reconcileIdeServer(log: LogFn): Promise<void>;
60
81
  /**
61
82
  * Local-only `/api/ide` management endpoint driving the lifecycle above:
62
- * `POST` starts (body `{ serverPath, port?, defaultFolder? }`), `DELETE` stops,
83
+ * `POST` starts (body `{ serverPath, port? }`), `DELETE` stops,
63
84
  * `GET` reports status. Reached only post-`isRequestAllowed` (key required) and
64
85
  * blocked from the tunnel like `/api/tunnel/*` — it spawns/kills a process.
65
86
  */
66
87
  export declare function handleIdeApi(req: http.IncomingMessage, res: http.ServerResponse, log: LogFn): Promise<void>;
67
- export {};
68
88
  //# sourceMappingURL=ide-server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ide-server.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/servers/ide-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAM7B,OAAO,EAGL,KAAK,eAAe,EAMrB,MAAM,sBAAsB,CAAC;AAE9B,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AA4BzE;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAElD;AAYD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC,eAAe,CAAC,CA6EhG;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAkClG;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,IAAI,SAAS,CAK3C;AAKD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,GAAE,KAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsBvF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAQlE;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,GAAG,EAAE,KAAK,GACT,OAAO,CAAC,IAAI,CAAC,CA6Cf"}
1
+ {"version":3,"file":"ide-server.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/servers/ide-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAK7B,OAAO,EAGL,KAAK,eAAe,EAMrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAGL,KAAK,KAAK,EAGX,MAAM,uBAAuB,CAAC;AA2B/B;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAElD;AAwBD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,eAAe,CAAC;IACxB;;;;;;;OAOG;IACH,eAAe,EAAE,OAAO,CAAC;CAC1B;AA4BD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC,CAEzF;AAsID;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAE5F;AAsCD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,IAAI,SAAS,CAK3C;AAKD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,GAAE,KAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAUvF;AAwBD;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAQlE;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,GAAG,EAAE,KAAK,GACT,OAAO,CAAC,IAAI,CAAC,CA4Cf"}