ftown 0.19.56 → 0.19.58

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 (62) hide show
  1. package/dist/bridge-update.d.ts +53 -0
  2. package/dist/bridge-update.js +212 -0
  3. package/dist/bridge-update.js.map +1 -0
  4. package/dist/centrifugo-client.d.ts +6 -1
  5. package/dist/centrifugo-client.js +70 -8
  6. package/dist/centrifugo-client.js.map +1 -1
  7. package/dist/claude-runner.d.ts +2 -0
  8. package/dist/claude-runner.js +4 -0
  9. package/dist/claude-runner.js.map +1 -1
  10. package/dist/command-rpc.d.ts +4 -0
  11. package/dist/command-rpc.js +40 -16
  12. package/dist/command-rpc.js.map +1 -1
  13. package/dist/create-ftown-session.d.ts +5 -14
  14. package/dist/create-ftown-session.js +21 -2
  15. package/dist/create-ftown-session.js.map +1 -1
  16. package/dist/index.d.ts +3 -0
  17. package/dist/index.js +102 -11
  18. package/dist/index.js.map +1 -1
  19. package/dist/installation-manifest.d.ts +1 -1
  20. package/dist/installation-manifest.js +1 -0
  21. package/dist/installation-manifest.js.map +1 -1
  22. package/dist/local-api-server.d.ts +3 -1
  23. package/dist/local-api-server.js +24 -9
  24. package/dist/local-api-server.js.map +1 -1
  25. package/dist/mail-delivery.d.ts +2 -1
  26. package/dist/mail-delivery.js +14 -7
  27. package/dist/mail-delivery.js.map +1 -1
  28. package/dist/security/bridge/execute.d.ts +2 -1
  29. package/dist/security/bridge/execute.js +13 -2
  30. package/dist/security/bridge/execute.js.map +1 -1
  31. package/dist/security/bridge/execution-observer.d.ts +12 -0
  32. package/dist/security/bridge/execution-observer.js +2 -0
  33. package/dist/security/bridge/execution-observer.js.map +1 -0
  34. package/dist/security/bridge/permissions.js +2 -2
  35. package/dist/security/bridge/permissions.js.map +1 -1
  36. package/dist/setup.js +2 -0
  37. package/dist/setup.js.map +1 -1
  38. package/dist/start-commands.js +3 -1
  39. package/dist/start-commands.js.map +1 -1
  40. package/dist/terminal-pump.d.ts +3 -0
  41. package/dist/terminal-pump.js +16 -7
  42. package/dist/terminal-pump.js.map +1 -1
  43. package/dist/types.d.ts +3 -2
  44. package/dist/update-admission.d.ts +24 -0
  45. package/dist/update-admission.js +67 -0
  46. package/dist/update-admission.js.map +1 -0
  47. package/dist/update-effects.d.ts +20 -0
  48. package/dist/update-effects.js +117 -0
  49. package/dist/update-effects.js.map +1 -0
  50. package/dist/update-handoff.d.ts +38 -0
  51. package/dist/update-handoff.js +637 -0
  52. package/dist/update-handoff.js.map +1 -0
  53. package/dist/update-protocol.d.ts +40 -0
  54. package/dist/update-protocol.js +2 -0
  55. package/dist/update-protocol.js.map +1 -0
  56. package/dist/update-release.d.ts +30 -0
  57. package/dist/update-release.js +246 -0
  58. package/dist/update-release.js.map +1 -0
  59. package/dist/update-runtime-contract.d.ts +85 -0
  60. package/dist/update-runtime-contract.js +3 -0
  61. package/dist/update-runtime-contract.js.map +1 -0
  62. package/package.json +3 -2
@@ -0,0 +1,20 @@
1
+ import type { SecureExecutionObserver } from './security/bridge/execution-observer.js';
2
+ import type { ApplicationJson, VerifiedApplication } from './security/protocol.js';
3
+ import { UpdateAdmission, UpdateResponseTicket } from './update-admission.js';
4
+ import type { ServerResponse } from 'node:http';
5
+ /** Tracks only authenticated in-process requests. Transport completion releases their admission fence. */
6
+ export declare class UpdateEffects implements SecureExecutionObserver {
7
+ private readonly admission;
8
+ private readonly entries;
9
+ constructor(admission: UpdateAdmission);
10
+ admitted(message: VerifiedApplication): void;
11
+ attachTicket(message: VerifiedApplication, ticket: UpdateResponseTicket): void;
12
+ sealed(message: VerifiedApplication, data: ApplicationJson): void;
13
+ delivered(requestId: string): void;
14
+ failed(requestId: string): void;
15
+ private finish;
16
+ }
17
+ /** Per-envelope guard prevents unauthenticated collisions from completing another request. */
18
+ export declare function scopedUpdateObserver(observer?: SecureExecutionObserver): SecureExecutionObserver | undefined;
19
+ /** Bind transport signals before writing, but never release a running dispatch on close. */
20
+ export declare function observeHttpDelivery(response: ServerResponse, observer: SecureExecutionObserver | undefined, requestId: string): (executionSucceeded: boolean) => void;
@@ -0,0 +1,117 @@
1
+ import { classifyCommand, classifyHttp, classifyTerminal } from './security/bridge/permissions.js';
2
+ const record = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
3
+ /** Tracks only authenticated in-process requests. Transport completion releases their admission fence. */
4
+ export class UpdateEffects {
5
+ admission;
6
+ entries = new Map();
7
+ constructor(admission) {
8
+ this.admission = admission;
9
+ }
10
+ admitted(message) {
11
+ const route = message.application.route;
12
+ const body = message.application.data;
13
+ const permission = route.kind === 'command' ? (route.command === 'security_activate_mcp' ? { mutating: true } : classifyCommand(route.command, record(body) ? body.payload : undefined))
14
+ : route.kind === 'http' ? classifyHttp(route.method, route.path)
15
+ : route.kind === 'terminal' ? classifyTerminal(route.frameType) : null;
16
+ const key = message.envelope.messageId;
17
+ if (!key || this.entries.has(key))
18
+ throw new Error('Duplicate secure request');
19
+ const release = permission?.mutating ? this.admission.enter() : () => { };
20
+ this.entries.set(key, { message, release, sealed: false });
21
+ }
22
+ attachTicket(message, ticket) {
23
+ const entry = this.entries.get(message.envelope.messageId);
24
+ if (!entry || entry.message !== message || entry.ticket || message.application.route.kind !== 'command' || message.application.route.command !== 'update_bridge') {
25
+ ticket.cancel();
26
+ throw new Error('Update response ticket is not bound to an admitted request');
27
+ }
28
+ entry.ticket = ticket;
29
+ entry.timer = setTimeout(() => {
30
+ if (entry.ticket !== ticket)
31
+ return;
32
+ ticket.cancel();
33
+ entry.ticket = undefined;
34
+ if (entry.sealed)
35
+ this.finish(message.envelope.messageId, false);
36
+ }, 30_000);
37
+ entry.timer.unref();
38
+ }
39
+ sealed(message, data) {
40
+ const entry = this.entries.get(message.envelope.messageId);
41
+ if (!entry || entry.message !== message)
42
+ throw new Error('Secure request is not admitted');
43
+ entry.sealed = true;
44
+ if (!entry.ticket)
45
+ return;
46
+ const route = message.application.route;
47
+ const input = message.application.data;
48
+ const response = record(data) && data.type === 'command_response' && record(data.response) ? data.response : null;
49
+ const accepted = response && record(response.data) ? response.data : null;
50
+ const op = accepted && record(accepted.operation) ? accepted.operation : null;
51
+ const payload = record(input) && record(input.payload) ? input.payload : null;
52
+ if (route.kind !== 'command' || route.command !== 'update_bridge' || !record(input) || input.requestId !== route.requestId
53
+ || !response || response.requestId !== route.requestId || response.success !== true
54
+ || !payload || !accepted || accepted.bridgeId !== payload.bridgeId || !op || op.id !== payload.operationId || op.targetVersion !== payload.targetVersion) {
55
+ this.finish(message.envelope.messageId, false);
56
+ return;
57
+ }
58
+ entry.ticket.markSealed();
59
+ }
60
+ delivered(requestId) { this.finish(requestId, true); }
61
+ failed(requestId) { this.finish(requestId, false); }
62
+ finish(key, delivered) {
63
+ const entry = this.entries.get(key);
64
+ if (!entry)
65
+ return;
66
+ this.entries.delete(key);
67
+ if (entry.timer)
68
+ clearTimeout(entry.timer);
69
+ entry.release();
70
+ if (delivered && entry.sealed)
71
+ entry.ticket?.markDelivered();
72
+ else
73
+ entry.ticket?.cancel();
74
+ }
75
+ }
76
+ /** Per-envelope guard prevents unauthenticated collisions from completing another request. */
77
+ export function scopedUpdateObserver(observer) {
78
+ if (!observer)
79
+ return undefined;
80
+ let key;
81
+ return {
82
+ admitted(message) { observer.admitted(message); key = message.envelope.messageId; },
83
+ sealed(message, data) { if (key !== message.envelope.messageId)
84
+ throw new Error('Secure request identity changed'); observer.sealed(message, data); },
85
+ delivered(id) { if (key === id) {
86
+ key = undefined;
87
+ observer.delivered(id);
88
+ } },
89
+ failed(id) { if (key === id) {
90
+ key = undefined;
91
+ observer.failed(id);
92
+ } },
93
+ };
94
+ }
95
+ /** Bind transport signals before writing, but never release a running dispatch on close. */
96
+ export function observeHttpDelivery(response, observer, requestId) {
97
+ let executionDone = false;
98
+ let closed = response.destroyed;
99
+ let finished = false;
100
+ let done = false;
101
+ const finalize = () => {
102
+ if (done || !executionDone || (!finished && !closed))
103
+ return;
104
+ done = true;
105
+ if (finished && !closed)
106
+ observer?.delivered(requestId);
107
+ else
108
+ observer?.failed(requestId);
109
+ };
110
+ response.once('finish', () => { finished = true; finalize(); });
111
+ response.once('close', () => { if (!finished)
112
+ closed = true; finalize(); });
113
+ response.once('error', () => { closed = true; finalize(); });
114
+ return succeeded => { executionDone = true; if (!succeeded)
115
+ closed = true; finalize(); };
116
+ }
117
+ //# sourceMappingURL=update-effects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-effects.js","sourceRoot":"","sources":["../src/update-effects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type ChildProcess } from 'node:child_process';
2
+ import type { PreparedHandoff, PreparedRelease, RestartDescriptor, UpdateReceipt, UpdateReservation, UpdateRestartContext } from './update-runtime-contract.js';
3
+ export declare class UpdateHandoffUncertainError extends Error {
4
+ readonly code: "handoff_uncertain";
5
+ constructor();
6
+ }
7
+ export declare function reserveUpdate(home: string, operationId: string): Promise<UpdateReservation>;
8
+ export declare function assertUpdateReservationAllowed(home: string): void;
9
+ export declare function readUpdateRestartContext(): UpdateRestartContext | null;
10
+ export declare function reportUpdateReady(identity: {
11
+ version: string;
12
+ bridgeId: string;
13
+ ownerId: string;
14
+ endpointId: string;
15
+ }): Promise<void>;
16
+ export declare function readUpdateReceipt(stagingRoot: string): Promise<UpdateReceipt | null>;
17
+ export declare function writeUpdateReceipt(stagingRoot: string, receipt: UpdateReceipt): Promise<void>;
18
+ /** Forward only ordinary runtime settings and the explicit trusted-LAN opt-in. */
19
+ export declare function selectUpdateLaunchEnvironment(source: Record<string, unknown>): Record<string, string>;
20
+ /** The ACK is an irreversible attempt: the replacement might receive it even if sending fails. */
21
+ export declare function finalizeUpdateReady(steps: {
22
+ persist: () => Promise<void>;
23
+ markAckAttempted: () => void;
24
+ acknowledge: () => Promise<void>;
25
+ release: () => Promise<void>;
26
+ }): Promise<void>;
27
+ /** After an ACK attempt, preserve the replacement and reservation on any uncertainty. */
28
+ export declare function protectOrStopReplacement(ackAttempted: boolean, steps: {
29
+ stop: () => Promise<void>;
30
+ retain: () => Promise<void>;
31
+ }): Promise<void>;
32
+ export declare function prepareHandoff(prepared: PreparedRelease, restart: RestartDescriptor, signal: AbortSignal): Promise<PreparedHandoff>;
33
+ export declare class UpdateProcessUncertainError extends Error {
34
+ readonly code: "update_process_uncertain";
35
+ constructor();
36
+ }
37
+ /** Bounded termination proof for helper-owned setup processes. */
38
+ export declare function waitForUpdateChild(child: ChildProcess, stop: () => void, timeoutMs: number, proofMs: number): Promise<void>;