@linkshell/gateway 0.4.55 → 0.5.1

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 (60) hide show
  1. package/Dockerfile +11 -3
  2. package/dist/gateway/src/embedded.d.ts +5 -0
  3. package/dist/gateway/src/embedded.js +23 -25
  4. package/dist/gateway/src/embedded.js.map +1 -1
  5. package/dist/gateway/src/index.js +47 -27
  6. package/dist/gateway/src/index.js.map +1 -1
  7. package/dist/gateway/src/relay.js +0 -13
  8. package/dist/gateway/src/relay.js.map +1 -1
  9. package/dist/gateway/tsconfig.tsbuildinfo +1 -1
  10. package/dist/gateway-v2/src/accounts.d.ts +6 -0
  11. package/dist/gateway-v2/src/accounts.js +32 -0
  12. package/dist/gateway-v2/src/accounts.js.map +1 -0
  13. package/dist/gateway-v2/src/index.d.ts +3 -0
  14. package/dist/gateway-v2/src/index.js +4 -0
  15. package/dist/gateway-v2/src/index.js.map +1 -0
  16. package/dist/gateway-v2/src/main.d.ts +1 -0
  17. package/dist/gateway-v2/src/main.js +17 -0
  18. package/dist/gateway-v2/src/main.js.map +1 -0
  19. package/dist/gateway-v2/src/server.d.ts +69 -0
  20. package/dist/gateway-v2/src/server.js +387 -0
  21. package/dist/gateway-v2/src/server.js.map +1 -0
  22. package/dist/gateway-v2/src/store.d.ts +30 -0
  23. package/dist/gateway-v2/src/store.js +102 -0
  24. package/dist/gateway-v2/src/store.js.map +1 -0
  25. package/dist/shared-protocol/src/index.d.ts +1495 -1339
  26. package/dist/shared-protocol/src/index.js +6 -0
  27. package/dist/shared-protocol/src/index.js.map +1 -1
  28. package/dist/wire/src/crypto.d.ts +65 -0
  29. package/dist/wire/src/crypto.js +253 -0
  30. package/dist/wire/src/crypto.js.map +1 -0
  31. package/dist/wire/src/index.d.ts +8 -0
  32. package/dist/wire/src/index.js +9 -0
  33. package/dist/wire/src/index.js.map +1 -0
  34. package/dist/wire/src/model.d.ts +751 -0
  35. package/dist/wire/src/model.js +176 -0
  36. package/dist/wire/src/model.js.map +1 -0
  37. package/dist/wire/src/peer.d.ts +42 -0
  38. package/dist/wire/src/peer.js +143 -0
  39. package/dist/wire/src/peer.js.map +1 -0
  40. package/dist/wire/src/relay-client.d.ts +82 -0
  41. package/dist/wire/src/relay-client.js +259 -0
  42. package/dist/wire/src/relay-client.js.map +1 -0
  43. package/dist/wire/src/relay.d.ts +481 -0
  44. package/dist/wire/src/relay.js +129 -0
  45. package/dist/wire/src/relay.js.map +1 -0
  46. package/dist/wire/src/rpc.d.ts +4835 -0
  47. package/dist/wire/src/rpc.js +357 -0
  48. package/dist/wire/src/rpc.js.map +1 -0
  49. package/dist/wire/src/shell.d.ts +2 -0
  50. package/dist/wire/src/shell.js +62 -0
  51. package/dist/wire/src/shell.js.map +1 -0
  52. package/dist/wire/src/updates.d.ts +3325 -0
  53. package/dist/wire/src/updates.js +210 -0
  54. package/dist/wire/src/updates.js.map +1 -0
  55. package/package.json +7 -2
  56. package/src/embedded.ts +31 -1
  57. package/src/index.ts +45 -2
  58. package/dist/gateway/src/agent-permission-http.d.ts +0 -119
  59. package/dist/gateway/src/agent-permission-http.js +0 -234
  60. package/dist/gateway/src/agent-permission-http.js.map +0 -1
@@ -1,234 +0,0 @@
1
- import { createEnvelope, parseTypedPayload, serializeEnvelope, } from "@linkshell/protocol";
2
- import { z } from "zod";
3
- const permissionOutcomeSchema = z.enum(["allow", "deny", "cancelled"]);
4
- const PERMISSION_ACK_TIMEOUT_MS = 12_000;
5
- export const agentPermissionHttpBodySchema = z.discriminatedUnion("protocol", [
6
- z.object({
7
- protocol: z.literal("v2"),
8
- sessionId: z.string().min(1),
9
- conversationId: z.string().min(1),
10
- requestId: z.string().min(1),
11
- outcome: permissionOutcomeSchema,
12
- optionId: z.string().optional(),
13
- terminalId: z.string().optional(),
14
- agentSessionId: z.string().optional(),
15
- }),
16
- z.object({
17
- protocol: z.literal("legacy"),
18
- sessionId: z.string().min(1),
19
- conversationId: z.string().optional(),
20
- agentSessionId: z.string().optional(),
21
- requestId: z.string().min(1),
22
- outcome: permissionOutcomeSchema,
23
- optionId: z.string().optional(),
24
- terminalId: z.string().optional(),
25
- }),
26
- z.object({
27
- protocol: z.literal("terminal"),
28
- sessionId: z.string().min(1),
29
- conversationId: z.string().optional(),
30
- requestId: z.string().min(1),
31
- outcome: permissionOutcomeSchema,
32
- optionId: z.string().optional(),
33
- terminalId: z.string().min(1).optional(),
34
- agentSessionId: z.string().optional(),
35
- }),
36
- ]);
37
- const pendingAcks = new Map();
38
- function ackKey(sessionId, requestId) {
39
- return `${sessionId}:${requestId}`;
40
- }
41
- export function resolveAgentPermissionHttpAck(input) {
42
- const key = ackKey(input.sessionId, input.ack.requestId);
43
- const pending = pendingAcks.get(key);
44
- if (!pending)
45
- return false;
46
- pendingAcks.delete(key);
47
- clearTimeout(pending.timer);
48
- pending.resolve(input.ack);
49
- return true;
50
- }
51
- function waitForAck(sessionId, requestId) {
52
- const key = ackKey(sessionId, requestId);
53
- const existing = pendingAcks.get(key);
54
- if (existing) {
55
- pendingAcks.delete(key);
56
- clearTimeout(existing.timer);
57
- existing.resolve({
58
- requestId,
59
- decision: "deny",
60
- resolved: false,
61
- delivered: false,
62
- message: "Superseded by a newer permission response",
63
- });
64
- }
65
- return new Promise((resolve) => {
66
- const timer = setTimeout(() => {
67
- pendingAcks.delete(key);
68
- resolve(null);
69
- }, PERMISSION_ACK_TIMEOUT_MS);
70
- pendingAcks.set(key, { resolve, timer });
71
- });
72
- }
73
- export async function forwardAgentPermissionHttp(input) {
74
- const { token, body, sessionManager, tokenManager } = input;
75
- if (!token || !tokenManager.owns(token, body.sessionId)) {
76
- return {
77
- status: 401,
78
- body: {
79
- error: "unauthorized",
80
- message: "Valid device token required",
81
- },
82
- };
83
- }
84
- const session = sessionManager.get(body.sessionId);
85
- if (!session) {
86
- return {
87
- status: 404,
88
- body: {
89
- error: "session_not_found",
90
- message: "Session not found",
91
- },
92
- };
93
- }
94
- if (!session.host || session.host.socket.readyState !== session.host.socket.OPEN) {
95
- return {
96
- status: 409,
97
- body: {
98
- error: "host_not_connected",
99
- message: "Host is not connected",
100
- },
101
- };
102
- }
103
- try {
104
- const envelopes = createPermissionEnvelopes(body);
105
- const waitsForDelivery = envelopes.some((envelope) => envelope.type === "permission.decision");
106
- const ackPromise = waitsForDelivery ? waitForAck(body.sessionId, body.requestId) : null;
107
- for (const envelope of envelopes) {
108
- session.host.socket.send(serializeEnvelope(envelope));
109
- }
110
- session.lastActivity = Date.now();
111
- if (ackPromise) {
112
- const ack = await ackPromise;
113
- if (!ack) {
114
- return {
115
- status: 504,
116
- forwarded: envelopes.map((envelope) => ({
117
- type: envelope.type,
118
- terminalId: envelope.terminalId,
119
- })),
120
- body: {
121
- error: "permission_ack_timeout",
122
- message: "Timed out waiting for host permission delivery acknowledgement",
123
- },
124
- };
125
- }
126
- if (!ack.delivered) {
127
- return {
128
- status: 409,
129
- forwarded: envelopes.map((envelope) => ({
130
- type: envelope.type,
131
- terminalId: envelope.terminalId,
132
- })),
133
- ack,
134
- body: {
135
- error: "permission_not_delivered",
136
- message: ack.message ?? "Permission response was not delivered to the Agent",
137
- resolved: ack.resolved,
138
- delivered: ack.delivered,
139
- },
140
- };
141
- }
142
- return {
143
- status: 200,
144
- forwarded: envelopes.map((envelope) => ({
145
- type: envelope.type,
146
- terminalId: envelope.terminalId,
147
- })),
148
- ack,
149
- body: {
150
- ok: true,
151
- resolved: ack.resolved,
152
- delivered: ack.delivered,
153
- },
154
- };
155
- }
156
- return {
157
- status: 200,
158
- forwarded: envelopes.map((envelope) => ({
159
- type: envelope.type,
160
- terminalId: envelope.terminalId,
161
- })),
162
- body: { ok: true },
163
- };
164
- }
165
- catch (err) {
166
- return {
167
- status: 400,
168
- body: {
169
- error: "invalid_payload",
170
- message: err instanceof Error ? err.message : "Invalid permission response",
171
- },
172
- };
173
- }
174
- }
175
- function createPermissionEnvelopes(body) {
176
- if (body.protocol === "v2") {
177
- const payload = parseTypedPayload("agent.v2.permission.respond", {
178
- conversationId: body.conversationId,
179
- requestId: body.requestId,
180
- outcome: body.outcome,
181
- optionId: body.optionId || undefined,
182
- });
183
- return [createEnvelope({
184
- type: "agent.v2.permission.respond",
185
- sessionId: body.sessionId,
186
- deviceId: "live-activity",
187
- payload,
188
- })];
189
- }
190
- if (body.protocol === "legacy") {
191
- const legacyPayload = parseTypedPayload("agent.permission.response", {
192
- agentSessionId: body.agentSessionId || undefined,
193
- requestId: body.requestId,
194
- outcome: body.outcome,
195
- optionId: body.optionId || undefined,
196
- });
197
- const envelopes = [createEnvelope({
198
- type: "agent.permission.response",
199
- sessionId: body.sessionId,
200
- deviceId: "live-activity",
201
- payload: legacyPayload,
202
- })];
203
- // `pr-*` requests are terminal PermissionRequest hooks surfaced through the
204
- // legacy Agent UI channel. Send the terminal decision too so older hosts, and
205
- // hosts that route hook permissions through terminal handling, can resolve it
206
- // without involving the mobile websocket/controller path.
207
- if (body.requestId.startsWith("pr-")) {
208
- const decisionPayload = parseTypedPayload("permission.decision", {
209
- requestId: body.requestId,
210
- decision: body.outcome === "allow" ? "allow" : "deny",
211
- });
212
- envelopes.push(createEnvelope({
213
- type: "permission.decision",
214
- sessionId: body.sessionId,
215
- terminalId: body.terminalId ?? "default",
216
- deviceId: "live-activity",
217
- payload: decisionPayload,
218
- }));
219
- }
220
- return envelopes;
221
- }
222
- const payload = parseTypedPayload("permission.decision", {
223
- requestId: body.requestId,
224
- decision: body.outcome === "allow" ? "allow" : "deny",
225
- });
226
- return [createEnvelope({
227
- type: "permission.decision",
228
- sessionId: body.sessionId,
229
- terminalId: body.terminalId ?? "default",
230
- deviceId: "live-activity",
231
- payload,
232
- })];
233
- }
234
- //# sourceMappingURL=agent-permission-http.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-permission-http.js","sourceRoot":"","sources":["../../../src/agent-permission-http.ts"],"names":[],"mappings":"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"}