aicodeman 0.9.3 → 0.9.5

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 (80) hide show
  1. package/dist/types/index.d.ts +1 -0
  2. package/dist/types/index.d.ts.map +1 -1
  3. package/dist/types/index.js +1 -0
  4. package/dist/types/index.js.map +1 -1
  5. package/dist/types/update.d.ts +79 -0
  6. package/dist/types/update.d.ts.map +1 -0
  7. package/dist/types/update.js +16 -0
  8. package/dist/types/update.js.map +1 -0
  9. package/dist/web/middleware/auth.d.ts +18 -0
  10. package/dist/web/middleware/auth.d.ts.map +1 -1
  11. package/dist/web/middleware/auth.js +33 -0
  12. package/dist/web/middleware/auth.js.map +1 -1
  13. package/dist/web/network-auth-policy.d.ts +38 -0
  14. package/dist/web/network-auth-policy.d.ts.map +1 -1
  15. package/dist/web/network-auth-policy.js +108 -0
  16. package/dist/web/network-auth-policy.js.map +1 -1
  17. package/dist/web/public/api-client.3adebdc2.js.gz +0 -0
  18. package/dist/web/public/app.c860ea08.js.gz +0 -0
  19. package/dist/web/public/{constants.cb6426c4.js → constants.5b68d2de.js} +39 -3
  20. package/dist/web/public/constants.5b68d2de.js.br +0 -0
  21. package/dist/web/public/constants.5b68d2de.js.gz +0 -0
  22. package/dist/web/public/image-input.7cade6a8.js.gz +0 -0
  23. package/dist/web/public/index.html +22 -4
  24. package/dist/web/public/index.html.br +0 -0
  25. package/dist/web/public/index.html.gz +0 -0
  26. package/dist/web/public/input-cjk.88082175.js.gz +0 -0
  27. package/dist/web/public/keyboard-accessory.cdfd8c04.js.gz +0 -0
  28. package/dist/web/public/mobile-handlers.1e2a8ef8.js.gz +0 -0
  29. package/dist/web/public/mobile.26dc30d6.css.gz +0 -0
  30. package/dist/web/public/notification-manager.9c984ac2.js.gz +0 -0
  31. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  32. package/dist/web/public/{panels-ui.3e304caf.js → panels-ui.5192a2c0.js} +8 -8
  33. package/dist/web/public/panels-ui.5192a2c0.js.br +0 -0
  34. package/dist/web/public/panels-ui.5192a2c0.js.gz +0 -0
  35. package/dist/web/public/ralph-panel.61076370.js.gz +0 -0
  36. package/dist/web/public/ralph-wizard.52d533d2.js.gz +0 -0
  37. package/dist/web/public/respawn-ui.5377f958.js.gz +0 -0
  38. package/dist/web/public/session-ui.3e0cf024.js.gz +0 -0
  39. package/dist/web/public/{settings-ui.c06be9c3.js → settings-ui.da0621e1.js} +8 -8
  40. package/dist/web/public/settings-ui.da0621e1.js.br +0 -0
  41. package/dist/web/public/settings-ui.da0621e1.js.gz +0 -0
  42. package/dist/web/public/styles.e87cb785.css.gz +0 -0
  43. package/dist/web/public/subagent-windows.a366a4ad.js.gz +0 -0
  44. package/dist/web/public/sw.js.gz +0 -0
  45. package/dist/web/public/terminal-ui.37caa926.js.gz +0 -0
  46. package/dist/web/public/upload.html.gz +0 -0
  47. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  48. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  49. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  50. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  51. package/dist/web/public/vendor/xterm-zerolag-input.137ad9f0.js.gz +0 -0
  52. package/dist/web/public/vendor/xterm.css.gz +0 -0
  53. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  54. package/dist/web/public/voice-input.085e9e73.js.gz +0 -0
  55. package/dist/web/routes/system-routes.d.ts.map +1 -1
  56. package/dist/web/routes/system-routes.js +30 -0
  57. package/dist/web/routes/system-routes.js.map +1 -1
  58. package/dist/web/routes/ws-routes.d.ts +2 -1
  59. package/dist/web/routes/ws-routes.d.ts.map +1 -1
  60. package/dist/web/routes/ws-routes.js +12 -1
  61. package/dist/web/routes/ws-routes.js.map +1 -1
  62. package/dist/web/self-update.d.ts +112 -0
  63. package/dist/web/self-update.d.ts.map +1 -0
  64. package/dist/web/self-update.js +518 -0
  65. package/dist/web/self-update.js.map +1 -0
  66. package/dist/web/server.d.ts +5 -0
  67. package/dist/web/server.d.ts.map +1 -1
  68. package/dist/web/server.js +45 -15
  69. package/dist/web/server.js.map +1 -1
  70. package/dist/web/sse-events.d.ts +5 -3
  71. package/dist/web/sse-events.d.ts.map +1 -1
  72. package/dist/web/sse-events.js +5 -3
  73. package/dist/web/sse-events.js.map +1 -1
  74. package/package.json +1 -1
  75. package/dist/web/public/constants.cb6426c4.js.br +0 -0
  76. package/dist/web/public/constants.cb6426c4.js.gz +0 -0
  77. package/dist/web/public/panels-ui.3e304caf.js.br +0 -0
  78. package/dist/web/public/panels-ui.3e304caf.js.gz +0 -0
  79. package/dist/web/public/settings-ui.c06be9c3.js.br +0 -0
  80. package/dist/web/public/settings-ui.c06be9c3.js.gz +0 -0
@@ -27,5 +27,6 @@
27
27
  */
28
28
  import { FastifyInstance } from 'fastify';
29
29
  import type { SessionPort } from '../ports/session-port.js';
30
- export declare function registerWsRoutes(app: FastifyInstance, ctx: SessionPort): void;
30
+ import { type HostPolicy } from '../network-auth-policy.js';
31
+ export declare function registerWsRoutes(app: FastifyInstance, ctx: SessionPort, getHostPolicy: () => HostPolicy): void;
31
32
  //# sourceMappingURL=ws-routes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ws-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/ws-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AA8B5D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAiJ7E"}
1
+ {"version":3,"file":"ws-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/ws-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAgD,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AA6B1G,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,GAAG,IAAI,CA4J9G"}
@@ -26,6 +26,7 @@
26
26
  * {"t":"z","c":N,"r":N} — resize terminal
27
27
  */
28
28
  import { MAX_INPUT_LENGTH } from '../../config/terminal-limits.js';
29
+ import { isAllowedRequestHost, isAllowedRequestOrigin } from '../network-auth-policy.js';
29
30
  /** Micro-batch interval for terminal output (ms). Short enough for low latency,
30
31
  * long enough to group Ink's rapid cursor-up redraw sequences into single frames. */
31
32
  const WS_BATCH_INTERVAL_MS = 8;
@@ -46,8 +47,18 @@ const DEC_2026_END = '\x1b[?2026l';
46
47
  const MAX_WS_PER_SESSION = 5;
47
48
  /** Track active WS connections per session for connection limiting. */
48
49
  const sessionWsCount = new Map();
49
- export function registerWsRoutes(app, ctx) {
50
+ export function registerWsRoutes(app, ctx, getHostPolicy) {
50
51
  app.get('/ws/sessions/:id/terminal', { websocket: true }, (socket, req) => {
52
+ // Reject cross-site WebSocket hijacking (CSWSH) and DNS-rebinding before doing
53
+ // anything: the upgrade must come from an allowed Host and (when the browser
54
+ // sends one — it always does for WS) a same-site Origin. Writing to this socket
55
+ // injects keystrokes into a --dangerously-skip-permissions agent, so this gate
56
+ // matters even on the default no-password install. See security review H5.
57
+ const policy = getHostPolicy();
58
+ if (!isAllowedRequestHost(req.headers.host, policy) || !isAllowedRequestOrigin(req.headers.origin, policy)) {
59
+ socket.close(4003, 'Forbidden');
60
+ return;
61
+ }
51
62
  const { id } = req.params;
52
63
  const session = ctx.sessions.get(id);
53
64
  if (!session) {
@@ -1 +1 @@
1
- {"version":3,"file":"ws-routes.js","sourceRoot":"","sources":["../../../src/web/routes/ws-routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ws-routes.js","sourceRoot":"","sources":["../../../src/web/routes/ws-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * @fileoverview Server-side logic for the in-app self-updater.
3
+ *
4
+ * Powers App Settings → Updates. Codeman is installed as a git clone and run
5
+ * under systemd (Linux) or launchd (macOS); updating means `git checkout <release
6
+ * tag> && npm install && npm run build && restart-the-service`. The hard part is
7
+ * that the update restarts the very process performing it, so the actual work
8
+ * runs in a DETACHED `scripts/self-update.sh` that outlives the restart, writing
9
+ * progress to `dataPath('update-status.json')` which the browser polls across the
10
+ * connection drop.
11
+ *
12
+ * Channel: latest tagged RELEASE (tags look like `codeman@0.9.3`). Dirty trees
13
+ * are auto-stashed (stash left for the user). Detection is manual (a button).
14
+ *
15
+ * Split into PURE helpers (semver/tag parsing, reconcile decision) that are unit
16
+ * tested, and IO wrappers (`getInstallInfo`, `checkForUpdate`, `startUpdate`,
17
+ * `reconcileUpdateOnBoot`) that touch git/network/fs.
18
+ *
19
+ * Related: `src/types/update.ts`, `scripts/self-update.sh`, routes in
20
+ * `src/web/routes/system-routes.ts`.
21
+ *
22
+ * @module web/self-update
23
+ */
24
+ import type { InstallInfo, SupervisorKind, UpdateCheckResult, UpdateStatus } from '../types/update.js';
25
+ export declare function isInFlight(status: UpdateStatus | null | undefined): boolean;
26
+ export interface ParsedVersion {
27
+ major: number;
28
+ minor: number;
29
+ patch: number;
30
+ /** Non-empty for prereleases like `0.9.3-rc1`. */
31
+ prerelease: string;
32
+ }
33
+ /**
34
+ * Parse a semver out of a release tag. Accepts `codeman@0.9.3`, `aicodeman@0.9.3`,
35
+ * `v0.9.3`, and bare `0.9.3` (with optional `-prerelease`). Returns null if no
36
+ * `X.Y.Z` is present.
37
+ */
38
+ export declare function parseVersionFromTag(tag: string): ParsedVersion | null;
39
+ /** Compare two parsed versions. Returns >0 if a>b, <0 if a<b, 0 if equal. A release outranks a prerelease of the same X.Y.Z. */
40
+ export declare function compareVersions(a: ParsedVersion, b: ParsedVersion): number;
41
+ /** True when `latest` is a strictly newer STABLE version than `current`. */
42
+ export declare function isNewerStableVersion(current: string, latest: string): boolean;
43
+ /**
44
+ * From a list of `refs/tags/...` (or bare tag names), pick the highest STABLE
45
+ * release tag we recognize. Skips prereleases and unrecognized tags.
46
+ */
47
+ export declare function pickLatestStableTag(tagRefs: string[]): {
48
+ tag: string;
49
+ version: string;
50
+ } | null;
51
+ /** Tags must match this before they're ever passed to the shell. */
52
+ export declare function isValidReleaseTag(tag: string): boolean;
53
+ /** Derive `{owner, repo}` from a GitHub SSH or HTTPS remote URL. */
54
+ export declare function parseGitHubRepo(remoteUrl: string): {
55
+ owner: string;
56
+ repo: string;
57
+ } | null;
58
+ /**
59
+ * PURE boot-time reconcile decision. Given the persisted status, the version the
60
+ * freshly-booted process is actually running, and `now`, return the status to
61
+ * persist — or null to leave it untouched.
62
+ *
63
+ * Rules (see plan "Hardening"):
64
+ * - Terminal phases → untouched.
65
+ * - Only the `restarting` marker (written right before the updater triggers our
66
+ * restart) flips to completed/failed by comparing running version vs. target.
67
+ * - Other in-flight phases are owned by the still-running updater scope — leave
68
+ * them alone so a normal/crash restart mid-update isn't misreported.
69
+ * - A backstop staleness guard fails any in-flight status older than the window.
70
+ */
71
+ export declare function reconcileStatusDecision(status: UpdateStatus | null, runningVersion: string, now: number): UpdateStatus | null;
72
+ /** Read the persisted status; tolerant of a missing/torn file (returns null). */
73
+ export declare function readUpdateStatus(): UpdateStatus | null;
74
+ /** Write the status atomically (temp + rename — readers never see a torn file). */
75
+ export declare function writeUpdateStatusAtomic(status: UpdateStatus): void;
76
+ /** Reconcile the status file on server boot (call once, early in start()). */
77
+ export declare function reconcileUpdateOnBoot(now?: number): void;
78
+ /**
79
+ * Resolve the repo root from this module's location. Compiled to
80
+ * `dist/web/self-update.js` (or `src/web/self-update.ts` under tsx) → two levels
81
+ * up is the package root that holds `package.json` and `.git`. Matches the
82
+ * `require('../../package.json')` resolution in `server.ts`.
83
+ */
84
+ export declare function resolveInstallDir(): string;
85
+ /**
86
+ * Detect which init system supervises us. Detection happens HERE (in the running
87
+ * server, which has a rich env) and the result is passed to the updater script —
88
+ * the detached child must not re-probe with a stripped-down environment.
89
+ */
90
+ export declare function detectSupervisor(): SupervisorKind;
91
+ /** Inspect the running install: kind, dir, branch, dirtiness, supervisor, version. */
92
+ export declare function getInstallInfo(): InstallInfo;
93
+ /** Check the configured remote for a newer release than the running version. */
94
+ export declare function checkForUpdate(): Promise<UpdateCheckResult>;
95
+ export type StartUpdateResult = {
96
+ ok: true;
97
+ updateId: string;
98
+ toTag: string;
99
+ toVersion: string | null;
100
+ } | {
101
+ ok: false;
102
+ code: 'disabled' | 'not-git' | 'in-flight' | 'up-to-date' | 'bad-tag' | 'error';
103
+ message: string;
104
+ };
105
+ /**
106
+ * Validate, snapshot the current commit, write the initial status, and spawn the
107
+ * detached updater. Returns immediately — progress is reported via the status file.
108
+ */
109
+ export declare function startUpdate(): Promise<StartUpdateResult>;
110
+ /** Current status for the polling endpoint; null collapses to an explicit idle. */
111
+ export declare function getUpdateStatusForApi(): UpdateStatus;
112
+ //# sourceMappingURL=self-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-update.d.ts","sourceRoot":"","sources":["../../src/web/self-update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAWH,OAAO,KAAK,EACV,WAAW,EAEX,cAAc,EACd,iBAAiB,EAEjB,YAAY,EACb,MAAM,oBAAoB,CAAC;AA4B5B,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE3E;AAMD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CASrE;AAED,gIAAgI;AAChI,wBAAgB,eAAe,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,MAAM,CAS1E;AAED,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAM7E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAkB9F;AAED,oEAAoE;AACpE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAIzF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,GAAG,IAAI,EAC3B,cAAc,EAAE,MAAM,EACtB,GAAG,EAAE,MAAM,GACV,YAAY,GAAG,IAAI,CA4BrB;AAMD,iFAAiF;AACjF,wBAAgB,gBAAgB,IAAI,YAAY,GAAG,IAAI,CAOtD;AAED,mFAAmF;AACnF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAIlE;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,GAAG,SAAa,GAAG,IAAI,CAI5D;AAmBD;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAK1C;AASD;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,cAAc,CAajD;AAMD,sFAAsF;AACtF,wBAAgB,cAAc,IAAI,WAAW,CAmB5C;AAyCD,gFAAgF;AAChF,wBAAsB,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAgDjE;AAMD,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACvE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAwDpH;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAwE9D;AAED,mFAAmF;AACnF,wBAAgB,qBAAqB,IAAI,YAAY,CAWpD"}