@juspay/shooter 1.11.0 → 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 (162) hide show
  1. package/.claude/hooks/notifier.cjs +199 -81
  2. package/build/client/_app/immutable/chunks/BX6TUKUr.js +3 -0
  3. package/build/client/_app/immutable/chunks/BX6TUKUr.js.br +0 -0
  4. package/build/client/_app/immutable/chunks/BX6TUKUr.js.gz +0 -0
  5. package/build/client/_app/immutable/chunks/{BlgsHm7b.js → C8fuqb5_.js} +1 -1
  6. package/build/client/_app/immutable/chunks/C8fuqb5_.js.br +0 -0
  7. package/build/client/_app/immutable/chunks/C8fuqb5_.js.gz +0 -0
  8. package/build/client/_app/immutable/chunks/{Ce85PELw.js → DXE_ttSN.js} +1 -1
  9. package/build/client/_app/immutable/chunks/DXE_ttSN.js.br +0 -0
  10. package/build/client/_app/immutable/chunks/{Ce85PELw.js.gz → DXE_ttSN.js.gz} +0 -0
  11. package/build/client/_app/immutable/entry/{app.BRJS3bSR.js → app.nFNxeHLO.js} +2 -2
  12. package/build/client/_app/immutable/entry/app.nFNxeHLO.js.br +0 -0
  13. package/build/client/_app/immutable/entry/app.nFNxeHLO.js.gz +0 -0
  14. package/build/client/_app/immutable/entry/start.Ja5Vj3Hy.js +1 -0
  15. package/build/client/_app/immutable/entry/start.Ja5Vj3Hy.js.br +2 -0
  16. package/build/client/_app/immutable/entry/start.Ja5Vj3Hy.js.gz +0 -0
  17. package/build/client/_app/immutable/nodes/{0.BdenYwQ0.js → 0.DPygfoxx.js} +1 -1
  18. package/build/client/_app/immutable/nodes/0.DPygfoxx.js.br +0 -0
  19. package/build/client/_app/immutable/nodes/0.DPygfoxx.js.gz +0 -0
  20. package/build/client/_app/immutable/nodes/{1.Dg4RfBlr.js → 1.CMzJ-vKL.js} +1 -1
  21. package/build/client/_app/immutable/nodes/1.CMzJ-vKL.js.br +0 -0
  22. package/build/client/_app/immutable/nodes/1.CMzJ-vKL.js.gz +0 -0
  23. package/build/client/_app/immutable/nodes/{2.DW-JPzyt.js → 2.Vq2hU4jC.js} +1 -1
  24. package/build/client/_app/immutable/nodes/2.Vq2hU4jC.js.br +0 -0
  25. package/build/client/_app/immutable/nodes/2.Vq2hU4jC.js.gz +0 -0
  26. package/build/client/_app/immutable/nodes/{3.bF7rX0-f.js → 3.C9533L9p.js} +1 -1
  27. package/build/client/_app/immutable/nodes/3.C9533L9p.js.br +0 -0
  28. package/build/client/_app/immutable/nodes/3.C9533L9p.js.gz +0 -0
  29. package/build/client/_app/immutable/nodes/{6.DSMOdSb2.js → 6.BJ2KZBR0.js} +1 -1
  30. package/build/client/_app/immutable/nodes/6.BJ2KZBR0.js.br +0 -0
  31. package/build/client/_app/immutable/nodes/6.BJ2KZBR0.js.gz +0 -0
  32. package/build/client/_app/immutable/nodes/{7.cNNZm7gF.js → 7.BW3qRNSj.js} +1 -1
  33. package/build/client/_app/immutable/nodes/7.BW3qRNSj.js.br +0 -0
  34. package/build/client/_app/immutable/nodes/7.BW3qRNSj.js.gz +0 -0
  35. package/build/client/_app/immutable/nodes/{8.DtjRdVVT.js → 8.BBF3ti4G.js} +1 -1
  36. package/build/client/_app/immutable/nodes/8.BBF3ti4G.js.br +0 -0
  37. package/build/client/_app/immutable/nodes/8.BBF3ti4G.js.gz +0 -0
  38. package/build/client/_app/immutable/nodes/{9._gEbLeEN.js → 9.LI1n0A_s.js} +1 -1
  39. package/build/client/_app/immutable/nodes/9.LI1n0A_s.js.br +0 -0
  40. package/build/client/_app/immutable/nodes/9.LI1n0A_s.js.gz +0 -0
  41. package/build/client/_app/version.json +1 -1
  42. package/build/client/_app/version.json.br +0 -0
  43. package/build/client/_app/version.json.gz +0 -0
  44. package/build/server/chunks/{0-Cdx5OqRN.js → 0-C5VG6nCZ.js} +3 -3
  45. package/build/server/chunks/{0-Cdx5OqRN.js.map → 0-C5VG6nCZ.js.map} +1 -1
  46. package/build/server/chunks/{1-BQErgU_W.js → 1-CxT3oFDd.js} +3 -3
  47. package/build/server/chunks/{1-BQErgU_W.js.map → 1-CxT3oFDd.js.map} +1 -1
  48. package/build/server/chunks/{2-BWmy5V7g.js → 2-D-hS2r7O.js} +3 -3
  49. package/build/server/chunks/{2-BWmy5V7g.js.map → 2-D-hS2r7O.js.map} +1 -1
  50. package/build/server/chunks/{3-ClpS_rbl.js → 3-qAPXfbJm.js} +3 -3
  51. package/build/server/chunks/{3-ClpS_rbl.js.map → 3-qAPXfbJm.js.map} +1 -1
  52. package/build/server/chunks/{4-CbejE1SC.js → 4-BtYdKCVW.js} +2 -2
  53. package/build/server/chunks/{4-CbejE1SC.js.map → 4-BtYdKCVW.js.map} +1 -1
  54. package/build/server/chunks/{5-BwqumuR1.js → 5-CvJK3PiH.js} +2 -2
  55. package/build/server/chunks/{5-BwqumuR1.js.map → 5-CvJK3PiH.js.map} +1 -1
  56. package/build/server/chunks/{6-CQHRlS4a.js → 6-Vj-4wida.js} +3 -3
  57. package/build/server/chunks/{6-CQHRlS4a.js.map → 6-Vj-4wida.js.map} +1 -1
  58. package/build/server/chunks/{7-VdriLQgS.js → 7-BYfx84Bj.js} +3 -3
  59. package/build/server/chunks/{7-VdriLQgS.js.map → 7-BYfx84Bj.js.map} +1 -1
  60. package/build/server/chunks/{8-SAsJLBKt.js → 8-CN6v3xbl.js} +3 -3
  61. package/build/server/chunks/{8-SAsJLBKt.js.map → 8-CN6v3xbl.js.map} +1 -1
  62. package/build/server/chunks/{9-BkY6ynKj.js → 9-BcAY9pkm.js} +3 -3
  63. package/build/server/chunks/{9-BkY6ynKj.js.map → 9-BcAY9pkm.js.map} +1 -1
  64. package/build/server/chunks/{Button-Dpueno77.js → Button-B5dU-ntz.js} +2 -2
  65. package/build/server/chunks/{Button-Dpueno77.js.map → Button-B5dU-ntz.js.map} +1 -1
  66. package/build/server/chunks/{Icon-aOLx5ELI.js → Icon-C7Ml3GX6.js} +3 -3
  67. package/build/server/chunks/{Icon-aOLx5ELI.js.map → Icon-C7Ml3GX6.js.map} +1 -1
  68. package/build/server/chunks/{Input-Cq7ZdLxS.js → Input-CPGO0sbS.js} +2 -2
  69. package/build/server/chunks/{Input-Cq7ZdLxS.js.map → Input-CPGO0sbS.js.map} +1 -1
  70. package/build/server/chunks/{Pill-Bn597jm0.js → Pill-CcrtCejm.js} +3 -3
  71. package/build/server/chunks/{Pill-Bn597jm0.js.map → Pill-CcrtCejm.js.map} +1 -1
  72. package/build/server/chunks/{Shimmer-5o7MVwXF.js → Shimmer-C5jkvGr1.js} +2 -2
  73. package/build/server/chunks/{Shimmer-5o7MVwXF.js.map → Shimmer-C5jkvGr1.js.map} +1 -1
  74. package/build/server/chunks/{_error.svelte-C85mEsv9.js → _error.svelte-CSIxs-ab.js} +8 -8
  75. package/build/server/chunks/{_error.svelte-C85mEsv9.js.map → _error.svelte-CSIxs-ab.js.map} +1 -1
  76. package/build/server/chunks/{_layout.svelte-rpYLLajc.js → _layout.svelte-noB4j-v2.js} +10 -10
  77. package/build/server/chunks/{_layout.svelte-rpYLLajc.js.map → _layout.svelte-noB4j-v2.js.map} +1 -1
  78. package/build/server/chunks/{_page.svelte-BfCXobKv.js → _page.svelte-B6qyh-K-.js} +11 -11
  79. package/build/server/chunks/{_page.svelte-BfCXobKv.js.map → _page.svelte-B6qyh-K-.js.map} +1 -1
  80. package/build/server/chunks/{_page.svelte-CA46TyHk.js → _page.svelte-BUkm2304.js} +5 -5
  81. package/build/server/chunks/{_page.svelte-CA46TyHk.js.map → _page.svelte-BUkm2304.js.map} +1 -1
  82. package/build/server/chunks/{_page.svelte-B6O0uTrK.js → _page.svelte-BV0XyYJZ.js} +4 -4
  83. package/build/server/chunks/{_page.svelte-B6O0uTrK.js.map → _page.svelte-BV0XyYJZ.js.map} +1 -1
  84. package/build/server/chunks/{_page.svelte-CCpVmMpU.js → _page.svelte-BfB8maoc.js} +9 -9
  85. package/build/server/chunks/{_page.svelte-CCpVmMpU.js.map → _page.svelte-BfB8maoc.js.map} +1 -1
  86. package/build/server/chunks/{_page.svelte-DjADcbfZ.js → _page.svelte-C60lAagP.js} +8 -8
  87. package/build/server/chunks/{_page.svelte-DjADcbfZ.js.map → _page.svelte-C60lAagP.js.map} +1 -1
  88. package/build/server/chunks/{_page.svelte-DUj1mSq0.js → _page.svelte-Dmg-RFCg.js} +7 -7
  89. package/build/server/chunks/{_page.svelte-DUj1mSq0.js.map → _page.svelte-Dmg-RFCg.js.map} +1 -1
  90. package/build/server/chunks/{_page.svelte-fkR4xqGu.js → _page.svelte-DnTpPnPR.js} +5 -5
  91. package/build/server/chunks/{_page.svelte-fkR4xqGu.js.map → _page.svelte-DnTpPnPR.js.map} +1 -1
  92. package/build/server/chunks/{_page.svelte-D0FBtMtH.js → _page.svelte-DuzZr5dA.js} +11 -11
  93. package/build/server/chunks/{_page.svelte-D0FBtMtH.js.map → _page.svelte-DuzZr5dA.js.map} +1 -1
  94. package/build/server/chunks/{_server.ts-HGYjOWF2.js → _server.ts-CFX-S_8q.js} +21 -3
  95. package/build/server/chunks/_server.ts-CFX-S_8q.js.map +1 -0
  96. package/build/server/chunks/_server.ts-CvJKTS3Z.js +35 -0
  97. package/build/server/chunks/_server.ts-CvJKTS3Z.js.map +1 -0
  98. package/build/server/chunks/{_server.ts-BBLuxvp6.js → _server.ts-tChyh9FX.js} +43 -8
  99. package/build/server/chunks/_server.ts-tChyh9FX.js.map +1 -0
  100. package/build/server/chunks/{cache-5_eamjtv.js → cache-Me3zUAaD.js} +2 -2
  101. package/build/server/chunks/{cache-5_eamjtv.js.map → cache-Me3zUAaD.js.map} +1 -1
  102. package/build/server/chunks/{client-w1WsLDGu.js → client-CfNnl32g.js} +4 -4
  103. package/build/server/chunks/{client-w1WsLDGu.js.map → client-CfNnl32g.js.map} +1 -1
  104. package/build/server/chunks/client2-DDP30_vY.js +7 -0
  105. package/build/server/chunks/{client2-B5wCRDQi.js.map → client2-DDP30_vY.js.map} +1 -1
  106. package/build/server/chunks/{index-DMikC9Qy.js → index-CJrGuxuM.js} +2 -2
  107. package/build/server/chunks/{index-DMikC9Qy.js.map → index-CJrGuxuM.js.map} +1 -1
  108. package/build/server/chunks/{index-server-DHNcb_Bd.js → index-server--49oHtA0.js} +2 -2
  109. package/build/server/chunks/{index-server-DHNcb_Bd.js.map → index-server--49oHtA0.js.map} +1 -1
  110. package/build/server/chunks/{index2-BTTf6mSG.js → index2-MY7PXeAc.js} +2 -2
  111. package/build/server/chunks/{index2-BTTf6mSG.js.map → index2-MY7PXeAc.js.map} +1 -1
  112. package/build/server/chunks/pending-requests-C9p57WoU.js +174 -0
  113. package/build/server/chunks/pending-requests-C9p57WoU.js.map +1 -0
  114. package/build/server/chunks/{root-DhBbA8QD.js → root-xvQIR1Bt.js} +2 -2
  115. package/build/server/chunks/{root-DhBbA8QD.js.map → root-xvQIR1Bt.js.map} +1 -1
  116. package/build/server/chunks/{state.svelte-M8y8rROy.js → state.svelte-RCtlkrNH.js} +3 -3
  117. package/build/server/chunks/{state.svelte-M8y8rROy.js.map → state.svelte-RCtlkrNH.js.map} +1 -1
  118. package/build/server/chunks/{stores-CwkRmCHA.js → stores-C-LqoonT.js} +4 -4
  119. package/build/server/chunks/{stores-CwkRmCHA.js.map → stores-C-LqoonT.js.map} +1 -1
  120. package/build/server/index.js +4 -4
  121. package/build/server/index.js.map +1 -1
  122. package/build/server/manifest.js +20 -13
  123. package/build/server/manifest.js.map +1 -1
  124. package/package.json +2 -2
  125. package/src/lib/modules/server/apn/pending-requests.ts +156 -33
  126. package/src/lib/types/decision.ts +114 -0
  127. package/src/lib/types/index.ts +1 -0
  128. package/src/routes/api/decide/[requestId]/+server.ts +46 -0
  129. package/src/routes/api/notify/+server.ts +43 -2
  130. package/src/routes/api/response/+server.ts +61 -11
  131. package/build/client/_app/immutable/chunks/BlgsHm7b.js.br +0 -0
  132. package/build/client/_app/immutable/chunks/BlgsHm7b.js.gz +0 -0
  133. package/build/client/_app/immutable/chunks/C9URPhwn.js +0 -3
  134. package/build/client/_app/immutable/chunks/C9URPhwn.js.br +0 -0
  135. package/build/client/_app/immutable/chunks/C9URPhwn.js.gz +0 -0
  136. package/build/client/_app/immutable/chunks/Ce85PELw.js.br +0 -0
  137. package/build/client/_app/immutable/entry/app.BRJS3bSR.js.br +0 -0
  138. package/build/client/_app/immutable/entry/app.BRJS3bSR.js.gz +0 -0
  139. package/build/client/_app/immutable/entry/start.D0irEiqS.js +0 -1
  140. package/build/client/_app/immutable/entry/start.D0irEiqS.js.br +0 -2
  141. package/build/client/_app/immutable/entry/start.D0irEiqS.js.gz +0 -0
  142. package/build/client/_app/immutable/nodes/0.BdenYwQ0.js.br +0 -0
  143. package/build/client/_app/immutable/nodes/0.BdenYwQ0.js.gz +0 -0
  144. package/build/client/_app/immutable/nodes/1.Dg4RfBlr.js.br +0 -0
  145. package/build/client/_app/immutable/nodes/1.Dg4RfBlr.js.gz +0 -0
  146. package/build/client/_app/immutable/nodes/2.DW-JPzyt.js.br +0 -0
  147. package/build/client/_app/immutable/nodes/2.DW-JPzyt.js.gz +0 -0
  148. package/build/client/_app/immutable/nodes/3.bF7rX0-f.js.br +0 -0
  149. package/build/client/_app/immutable/nodes/3.bF7rX0-f.js.gz +0 -0
  150. package/build/client/_app/immutable/nodes/6.DSMOdSb2.js.br +0 -0
  151. package/build/client/_app/immutable/nodes/6.DSMOdSb2.js.gz +0 -0
  152. package/build/client/_app/immutable/nodes/7.cNNZm7gF.js.br +0 -0
  153. package/build/client/_app/immutable/nodes/7.cNNZm7gF.js.gz +0 -0
  154. package/build/client/_app/immutable/nodes/8.DtjRdVVT.js.br +0 -0
  155. package/build/client/_app/immutable/nodes/8.DtjRdVVT.js.gz +0 -0
  156. package/build/client/_app/immutable/nodes/9._gEbLeEN.js.br +0 -0
  157. package/build/client/_app/immutable/nodes/9._gEbLeEN.js.gz +0 -0
  158. package/build/server/chunks/_server.ts-BBLuxvp6.js.map +0 -1
  159. package/build/server/chunks/_server.ts-HGYjOWF2.js.map +0 -1
  160. package/build/server/chunks/client2-B5wCRDQi.js +0 -7
  161. package/build/server/chunks/pending-requests-B-JNGxpk.js +0 -96
  162. package/build/server/chunks/pending-requests-B-JNGxpk.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import type { NotificationData } from '$lib/types';
1
+ import type { NotificationData, OptionChoice, ResponseKind } from '$lib/types';
2
2
 
3
3
  import { env } from '$env/dynamic/private';
4
4
  import { LibraryAPNsService } from '$lib/modules/server/apn/library-apns';
@@ -266,6 +266,11 @@ function recordNotification(title: string, message: string, data?: NotificationD
266
266
  notificationCache.set(key, Date.now());
267
267
  }
268
268
 
269
+ // TODO(refactor): extract body parsing, filtering, and platform routing into
270
+ // helpers. This handler grew past the 300-line guideline organically; PR-2
271
+ // adds 4 lines for dynamic-options fields. A dedicated cleanup PR is the
272
+ // right place to split it, not a feature PR.
273
+ // eslint-disable-next-line max-lines-per-function
269
274
  export const POST: RequestHandler = async ({ request }) => {
270
275
  try {
271
276
  // Use singleton APNs client to reuse HTTP/2 connection
@@ -297,6 +302,29 @@ export const POST: RequestHandler = async ({ request }) => {
297
302
  const waitForResponse =
298
303
  typeof body.waitForResponse === 'boolean' ? body.waitForResponse : false;
299
304
 
305
+ // Dynamic-options fields (PR-2/PR-3). When the caller wants to drive
306
+ // a richer notification category — plan-mode approval, MCP
307
+ // elicitation, AskUserQuestion choices — these arrive in the top
308
+ // level of the body so they can be persisted in pending_requests
309
+ // and surfaced to the iOS Decide screen via /api/decide/[id].
310
+ //
311
+ // Backward-compat: when these are omitted, the existing CLAUDE_
312
+ // PERMISSION binary flow is unchanged.
313
+ const notificationCategory =
314
+ typeof body.notificationCategory === 'string' && body.notificationCategory.length > 0
315
+ ? body.notificationCategory
316
+ : undefined;
317
+ const question = typeof body.question === 'string' ? body.question : undefined;
318
+ const options =
319
+ Array.isArray(body.options) && body.options.every((o) => o && typeof o === 'object')
320
+ ? (body.options as OptionChoice[])
321
+ : undefined;
322
+ const responseKindRaw = body.responseKind;
323
+ const responseKind: ResponseKind | undefined =
324
+ responseKindRaw === 'hook' || responseKindRaw === 'pty' || responseKindRaw === 'info'
325
+ ? responseKindRaw
326
+ : undefined;
327
+
300
328
  // Broadcast to /ws/events for real-time activity feed
301
329
  try {
302
330
  broadcastHookEvent(body);
@@ -350,6 +378,9 @@ export const POST: RequestHandler = async ({ request }) => {
350
378
  if (skipPush) {
351
379
  if (waitForResponse) {
352
380
  createPendingRequest(canonicalRequestId, {
381
+ options,
382
+ question: question ?? null,
383
+ responseKind: responseKind ?? 'hook',
353
384
  sessionId: (data?.sessionId as string) || '',
354
385
  toolInput: (data?.toolInput as Record<string, unknown>) || {},
355
386
  toolName: (data?.toolName as string) || '',
@@ -370,7 +401,11 @@ export const POST: RequestHandler = async ({ request }) => {
370
401
  const payload = {
371
402
  badge: 1,
372
403
  body: message,
373
- category: waitForResponse ? 'CLAUDE_PERMISSION' : undefined,
404
+ // notificationCategory wins when explicitly set so plan-mode /
405
+ // elicitation flows can pick CLAUDE_PLAN_APPROVAL / CHOICE_2..4.
406
+ // Falls back to CLAUDE_PERMISSION for the legacy bidirectional
407
+ // permission flow when only waitForResponse is provided.
408
+ category: notificationCategory ?? (waitForResponse ? 'CLAUDE_PERMISSION' : undefined),
374
409
  data: {
375
410
  ...data,
376
411
  requestId: canonicalRequestId,
@@ -429,6 +464,9 @@ export const POST: RequestHandler = async ({ request }) => {
429
464
 
430
465
  if (waitForResponse) {
431
466
  createPendingRequest(canonicalRequestId, {
467
+ options,
468
+ question: question ?? null,
469
+ responseKind: responseKind ?? 'hook',
432
470
  sessionId: (data?.sessionId as string) || '',
433
471
  toolInput: (data?.toolInput as Record<string, unknown>) || {},
434
472
  toolName: (data?.toolName as string) || '',
@@ -505,6 +543,9 @@ export const POST: RequestHandler = async ({ request }) => {
505
543
  // only after confirming APNs delivery succeeded
506
544
  if (waitForResponse) {
507
545
  createPendingRequest(canonicalRequestId, {
546
+ options,
547
+ question: question ?? null,
548
+ responseKind: responseKind ?? 'hook',
508
549
  sessionId: (data?.sessionId as string) || '',
509
550
  toolInput: (data?.toolInput as Record<string, unknown>) || {},
510
551
  toolName: (data?.toolName as string) || '',
@@ -1,11 +1,31 @@
1
- import { cleanup, getDecision, setDecision } from '$lib/modules/server/apn/pending-requests';
1
+ import {
2
+ cleanup,
3
+ getDecision,
4
+ getRichRequest,
5
+ setDecision,
6
+ } from '$lib/modules/server/apn/pending-requests';
2
7
  import { validateAuth } from '$lib/modules/server/auth';
3
8
  import { toErrorMessage } from '$lib/modules/server/utils/error';
9
+ import { type DecisionKind, isDecisionKind } from '$lib/types';
4
10
  import { json } from '@sveltejs/kit';
5
11
 
6
12
  import type { RequestHandler } from './$types';
7
13
 
8
- // POST /api/response — iOS app sends the user's decision
14
+ // POST /api/response — iOS app sends the user's decision.
15
+ //
16
+ // Accepts the full DecisionKind union (allow/deny/option_1..4/plan_*).
17
+ // Routing of the decision back to Claude Code depends on the stored
18
+ // `response_kind` on the pending request:
19
+ //
20
+ // - 'hook' (default): notifier.cjs is in a GET poll loop on this
21
+ // same endpoint; setDecision() flips the row and the next poll
22
+ // returns 'decided' so the hook can write its stdout response.
23
+ // - 'pty' : the active Claude Code session is in a Shooter-managed
24
+ // PTY; the user's choice will be written to that PTY's stdin so
25
+ // Claude Code sees it as if the user typed at the laptop. Wired up
26
+ // in PR-3; for PR-1 we accept the decision and stub the routing.
27
+ // - 'info': no routing back to Claude Code. Decision is recorded for
28
+ // audit / UI feedback only.
9
29
  export const POST: RequestHandler = async ({ request }) => {
10
30
  cleanup();
11
31
 
@@ -14,9 +34,9 @@ export const POST: RequestHandler = async ({ request }) => {
14
34
  return authError;
15
35
  }
16
36
 
17
- let body: { decision?: string; requestId?: string };
37
+ let body: { decision?: unknown; requestId?: unknown };
18
38
  try {
19
- body = (await request.json()) as { decision?: string; requestId?: string };
39
+ body = (await request.json()) as { decision?: unknown; requestId?: unknown };
20
40
  } catch {
21
41
  return json({ error: 'Invalid JSON in request body' }, { status: 400 });
22
42
  }
@@ -24,23 +44,53 @@ export const POST: RequestHandler = async ({ request }) => {
24
44
  try {
25
45
  const { decision, requestId } = body;
26
46
 
27
- if (!requestId || !decision) {
28
- return json({ error: 'requestId and decision are required' }, { status: 400 });
47
+ if (typeof requestId !== 'string' || requestId.length === 0) {
48
+ return json({ error: 'requestId must be a non-empty string' }, { status: 400 });
29
49
  }
30
-
31
- if (decision !== 'allow' && decision !== 'deny') {
32
- return json({ error: 'decision must be "allow" or "deny"' }, { status: 400 });
50
+ if (!isDecisionKind(decision)) {
51
+ return json(
52
+ {
53
+ error:
54
+ 'decision must be one of allow, deny, option_1..4, plan_auto, plan_accept, plan_review, plan_keep',
55
+ },
56
+ { status: 400 }
57
+ );
33
58
  }
34
59
 
35
- const found = setDecision(requestId, decision);
60
+ // Persist first so polling notifier.cjs picks it up regardless of
61
+ // which response_kind we route on. The 'pty' branch is additive —
62
+ // it ALSO writes to the PTY but the row remains the source of truth.
63
+ const decisionTyped: DecisionKind = decision;
64
+ const found = setDecision(requestId, decisionTyped);
36
65
  if (!found) {
37
66
  return json({ error: 'Request not found or expired' }, { status: 404 });
38
67
  }
39
68
 
40
- console.log(`[response] Decision received: ${decision} for request ${requestId}`);
69
+ // Routing dispatch. For PR-1 only the 'hook' path is functional;
70
+ // 'pty' and 'info' are accepted but don't yet forward anywhere
71
+ // (PR-3 wires PTY; 'info' is intentionally no-op).
72
+ const entry = getRichRequest(requestId);
73
+ const responseKind = entry?.responseKind ?? 'hook';
74
+
75
+ console.log(
76
+ `[response] Decision received: ${decisionTyped} for request ${requestId} (responseKind=${responseKind})`
77
+ );
78
+
79
+ if (responseKind === 'pty') {
80
+ // PR-3 will write the chosen option to the matching PTY's stdin.
81
+ // For PR-1 we accept and persist so the user gets a "Decision
82
+ // recorded" confirmation — the laptop just won't act on it yet.
83
+ return json({
84
+ message: 'Decision recorded; PTY routing not yet implemented',
85
+ responseKind,
86
+ success: true,
87
+ timestamp: new Date().toISOString(),
88
+ });
89
+ }
41
90
 
42
91
  return json({
43
92
  message: 'Decision recorded',
93
+ responseKind,
44
94
  success: true,
45
95
  timestamp: new Date().toISOString(),
46
96
  });
@@ -1,3 +0,0 @@
1
- import{bv as Te,v as Ve,s as P,g as j,b as N,P as oe,bw as At}from"./DYuMZGL5.js";class pe{constructor(t,n){this.status=t,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${t}`}}toString(){return JSON.stringify(this.body)}}class Le{constructor(t,n){this.status=t,this.location=n}}class Pe extends Error{constructor(t,n,r){super(r),this.status=t,this.text=n}}new URL("sveltekit-internal://");function Et(e,t){return e==="/"||t==="ignore"?e:t==="never"?e.endsWith("/")?e.slice(0,-1):e:t==="always"&&!e.endsWith("/")?e+"/":e}function kt(e){return e.split("%25").map(decodeURI).join("%25")}function Rt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function ye({href:e}){return e.split("#")[0]}function St(...e){let t=5381;for(const n of e)if(typeof n=="string"){let r=n.length;for(;r;)t=t*33^n.charCodeAt(--r)}else if(ArrayBuffer.isView(n)){const r=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let a=r.length;for(;a;)t=t*33^r[--a]}else throw new TypeError("value must be a string or TypedArray");return(t>>>0).toString(36)}new TextEncoder;const It=new TextDecoder;function Ut(e){const t=atob(e),n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=t.charCodeAt(r);return n}const Tt=window.fetch;window.fetch=(e,t)=>((e instanceof Request?e.method:t?.method||"GET")!=="GET"&&z.delete(je(e)),Tt(e,t));const z=new Map;function Lt(e,t){const n=je(e,t),r=document.querySelector(n);if(r?.textContent){r.remove();let{body:a,...s}=JSON.parse(r.textContent);const o=r.getAttribute("data-ttl");return o&&z.set(n,{body:a,init:s,ttl:1e3*Number(o)}),r.getAttribute("data-b64")!==null&&(a=Ut(a)),Promise.resolve(new Response(a,s))}return window.fetch(e,t)}function Pt(e,t,n){if(z.size>0){const r=je(e,n),a=z.get(r);if(a){if(performance.now()<a.ttl&&["default","force-cache","only-if-cached",void 0].includes(n?.cache))return new Response(a.body,a.init);z.delete(r)}}return window.fetch(t,n)}function je(e,t){let r=`script[data-sveltekit-fetched][data-url=${JSON.stringify(e instanceof Request?e.url:e)}]`;if(t?.headers||t?.body){const a=[];t.headers&&a.push([...new Headers(t.headers)].join(",")),t.body&&(typeof t.body=="string"||ArrayBuffer.isView(t.body))&&a.push(t.body),r+=`[data-hash="${St(...a)}"]`}return r}const jt=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/;function Nt(e){const t=[];return{pattern:e==="/"?/^\/$/:new RegExp(`^${xt(e).map(r=>{const a=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(r);if(a)return t.push({name:a[1],matcher:a[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const s=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(r);if(s)return t.push({name:s[1],matcher:s[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!r)return;const o=r.split(/\[(.+?)\](?!\])/);return"/"+o.map((i,l)=>{if(l%2){if(i.startsWith("x+"))return ve(String.fromCharCode(parseInt(i.slice(2),16)));if(i.startsWith("u+"))return ve(String.fromCharCode(...i.slice(2).split("-").map(g=>parseInt(g,16))));const u=jt.exec(i),[,d,p,h,f]=u;return t.push({name:h,matcher:f,optional:!!d,rest:!!p,chained:p?l===1&&o[0]==="":!1}),p?"([^]*?)":d?"([^/]*)?":"([^/]+?)"}return ve(i)}).join("")}).join("")}/?$`),params:t}}function Ot(e){return e!==""&&!/^\([^)]+\)$/.test(e)}function xt(e){return e.slice(1).split("/").filter(Ot)}function Ct(e,t,n){const r={},a=e.slice(1),s=a.filter(c=>c!==void 0);let o=0;for(let c=0;c<t.length;c+=1){const i=t[c];let l=a[c-o];if(i.chained&&i.rest&&o&&(l=a.slice(c-o,c+1).filter(u=>u).join("/"),o=0),l===void 0)if(i.rest)l="";else continue;if(!i.matcher||n[i.matcher](l)){r[i.name]=l;const u=t[c+1],d=a[c+1];u&&!u.rest&&u.optional&&d&&i.chained&&(o=0),!u&&!d&&Object.keys(r).length===s.length&&(o=0);continue}if(i.optional&&i.chained){o++;continue}return}if(!o)return r}function ve(e){return e.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Dt({nodes:e,server_loads:t,dictionary:n,matchers:r}){const a=new Set(t);return Object.entries(n).map(([c,[i,l,u]])=>{const{pattern:d,params:p}=Nt(c),h={id:c,exec:f=>{const g=d.exec(f);if(g)return Ct(g,p,r)},errors:[1,...u||[]].map(f=>e[f]),layouts:[0,...l||[]].map(o),leaf:s(i)};return h.errors.length=h.layouts.length=Math.max(h.errors.length,h.layouts.length),h});function s(c){const i=c<0;return i&&(c=~c),[i,e[c]]}function o(c){return c===void 0?c:[a.has(c),e[c]]}}function Qe(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function qe(e,t,n=JSON.stringify){const r=n(t);try{sessionStorage[e]=r}catch{}}const U=globalThis.__sveltekit_172snbl?.base??"",$t=globalThis.__sveltekit_172snbl?.assets??U??"",Bt="1779655600378",et="sveltekit:snapshot",tt="sveltekit:scroll",nt="sveltekit:states",Ft="sveltekit:pageurl",q="sveltekit:history",Q="sveltekit:navigation",B={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},re=location.origin;function Ne(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){const n=document.getElementsByTagName("base");t=n.length?n[0].href:document.URL}return new URL(e,t)}function M(){return{x:pageXOffset,y:pageYOffset}}function V(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const Ye={...B,"":B.hover};function rt(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function at(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=rt(e)}}function Ee(e,t,n){let r;try{if(r=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){const c=location.hash.split("#")[1]||"/";r.hash=`#${c}${r.hash}`}}catch{}const a=e instanceof SVGAElement?e.target.baseVal:e.target,s=!r||!!a||_e(r,t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),o=r?.origin===re&&e.hasAttribute("download");return{url:r,external:s,target:a,download:o}}function se(e){let t=null,n=null,r=null,a=null,s=null,o=null,c=e;for(;c&&c!==document.documentElement;)r===null&&(r=V(c,"preload-code")),a===null&&(a=V(c,"preload-data")),t===null&&(t=V(c,"keepfocus")),n===null&&(n=V(c,"noscroll")),s===null&&(s=V(c,"reload")),o===null&&(o=V(c,"replacestate")),c=rt(c);function i(l){switch(l){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:Ye[r??"off"],preload_data:Ye[a??"off"],keepfocus:i(t),noscroll:i(n),reload:i(s),replace_state:i(o)}}function Ge(e){const t=Te(e);let n=!0;function r(){n=!0,t.update(o=>o)}function a(o){n=!1,t.set(o)}function s(o){let c;return t.subscribe(i=>{(c===void 0||n&&i!==c)&&o(c=i)})}return{notify:r,set:a,subscribe:s}}const ot={v:()=>{}};function Mt(){const{set:e,subscribe:t}=Te(!1);let n;async function r(){clearTimeout(n);try{const a=await fetch(`${$t}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!a.ok)return!1;const o=(await a.json()).version!==Bt;return o&&(e(!0),ot.v(),clearTimeout(n)),o}catch{return!1}}return{subscribe:t,check:r}}function _e(e,t,n){return e.origin!==re||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function jn(e){}const Vt=-1,qt=-2,Yt=-3,Gt=-4,Kt=-5,Wt=-6,Ht=-7,st=2**32-1,ke=st-1;function Xt(e){return!(!Number.isInteger(e)||e<0||e>ke)}function zt(e){return!(!Number.isInteger(e)||e<0||e>st)}function Jt(e){return Uint8Array.fromBase64(e).buffer}function Zt(e){return Uint8Array.from(Buffer.from(e,"base64")).buffer}function Qt(e){const t=atob(e),n=t.length,r=new Uint8Array(n);for(let a=0;a<n;a++)r[a]=t.charCodeAt(a);return r.buffer}const en=typeof Uint8Array.fromBase64=="function",tn=typeof process=="object"&&process.versions?.node!==void 0,nn=en?Jt:tn?Zt:Qt;function rn(e,t){if(typeof e=="number")return s(e,!0);if(!Array.isArray(e)||e.length===0)throw new Error("Invalid input");const n=e,r=Array(n.length);let a=null;function s(o,c=!1){if(o===Vt)return;if(o===Yt)return NaN;if(o===Gt)return 1/0;if(o===Kt)return-1/0;if(o===Wt)return-0;if(c||typeof o!="number")throw new Error("Invalid input");if(o in r)return r[o];const i=n[o];if(!i||typeof i!="object")r[o]=i;else if(Array.isArray(i))if(typeof i[0]=="string"){const l=i[0],u=t&&Object.hasOwn(t,l)?t[l]:void 0;if(u){let d=i[1];if(typeof d!="number"&&(d=n.push(i[1])-1),a??=new Set,a.has(d))throw new Error("Invalid circular reference");return a.add(d),r[o]=u(s(d)),a.delete(d),r[o]}switch(l){case"Date":r[o]=new Date(i[1]);break;case"Set":const d=new Set;r[o]=d;for(let f=1;f<i.length;f+=1)d.add(s(i[f]));break;case"Map":const p=new Map;r[o]=p;for(let f=1;f<i.length;f+=2)p.set(s(i[f]),s(i[f+1]));break;case"RegExp":r[o]=new RegExp(i[1],i[2]);break;case"Object":{const f=i[1];if(typeof n[f]=="object"&&n[f][0]!=="BigInt")throw new Error("Invalid input");r[o]=Object(s(f));break}case"BigInt":r[o]=BigInt(i[1]);break;case"null":const h=Object.create(null);r[o]=h;for(let f=1;f<i.length;f+=2){if(i[f]==="__proto__")throw new Error("Cannot parse an object with a `__proto__` property");h[i[f]]=s(i[f+1])}break;case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Float16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":case"DataView":{if(n[i[1]][0]!=="ArrayBuffer")throw new Error("Invalid data");const f=globalThis[l],g=s(i[1]);r[o]=i[2]!==void 0?new f(g,i[2],i[3]):new f(g);break}case"ArrayBuffer":{const f=i[1];if(typeof f!="string")throw new Error("Invalid ArrayBuffer encoding");const g=nn(f);r[o]=g;break}case"Temporal.Duration":case"Temporal.Instant":case"Temporal.PlainDate":case"Temporal.PlainTime":case"Temporal.PlainDateTime":case"Temporal.PlainMonthDay":case"Temporal.PlainYearMonth":case"Temporal.ZonedDateTime":{const f=l.slice(9);r[o]=Temporal[f].from(i[1]);break}case"URL":{const f=new URL(i[1]);r[o]=f;break}case"URLSearchParams":{const f=new URLSearchParams(i[1]);r[o]=f;break}default:throw new Error(`Unknown type ${l}`)}}else if(i[0]===Ht){const l=i[1];if(!zt(l))throw new Error("Invalid input");const u=[];r[o]=u,u[ke]=void 0,delete u[ke];for(let d=2;d<i.length;d+=2){const p=i[d];if(!Xt(p)||p>=l)throw new Error("Invalid input");u[p]=s(i[d+1])}u.length=l}else{const l=new Array(i.length);r[o]=l;for(let u=0;u<i.length;u+=1){const d=i[u];d!==qt&&(l[u]=s(d))}}else{const l={};r[o]=l;for(const u of Object.keys(i)){if(u==="__proto__")throw new Error("Cannot parse an object with a `__proto__` property");const d=i[u];l[u]=s(d)}}return r[o]}return s(0)}const it=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...it];const an=new Set([...it]);[...an];function on(e){return e.filter(t=>t!=null)}const sn="x-sveltekit-invalidated",cn="x-sveltekit-trailing-slash";function ie(e){return e instanceof pe||e instanceof Pe?e.status:500}function ln(e){return e instanceof Pe?e.text:"Internal Error"}let S,ee,be;const fn=Ve.toString().includes("$$")||/function \w+\(\) \{\}/.test(Ve.toString()),Ke="a:";fn?(S={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(Ke)},ee={current:null},be={current:!1}):(S=new class{#e=P({});get data(){return j(this.#e)}set data(t){N(this.#e,t)}#t=P(null);get form(){return j(this.#t)}set form(t){N(this.#t,t)}#n=P(null);get error(){return j(this.#n)}set error(t){N(this.#n,t)}#r=P({});get params(){return j(this.#r)}set params(t){N(this.#r,t)}#a=P({id:null});get route(){return j(this.#a)}set route(t){N(this.#a,t)}#o=P({});get state(){return j(this.#o)}set state(t){N(this.#o,t)}#s=P(-1);get status(){return j(this.#s)}set status(t){N(this.#s,t)}#i=P(new URL(Ke));get url(){return j(this.#i)}set url(t){N(this.#i,t)}},ee=new class{#e=P(null);get current(){return j(this.#e)}set current(t){N(this.#e,t)}},be=new class{#e=P(!1);get current(){return j(this.#e)}set current(t){N(this.#e,t)}},ot.v=()=>be.current=!0);function un(e){Object.assign(S,e)}const dn="/__data.json",hn=".html__data.json";function pn(e){return e.endsWith(".html")?e.replace(/\.html$/,hn):e.replace(/\/$/,"")+dn}const _n=new Set(["icon","shortcut icon","apple-touch-icon"]);let H=null;const D=Qe(tt)??{},te=Qe(et)??{},C={url:Ge({}),page:Ge({}),navigating:Te(null),updated:Mt()};function Oe(e){D[e]=M()}function gn(e,t){let n=e+1;for(;D[n];)delete D[n],n+=1;for(n=t+1;te[n];)delete te[n],n+=1}function K(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(()=>{})}async function ct(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(U||"/");e&&await e.update()}}function We(){}let xe,Re,ce,x,Se,A;const le=[],fe=[];let L=null;function Ie(){L?.fork?.then(e=>e?.discard()),L=null}const ae=new Map,lt=new Set,mn=new Set,J=new Set;let w={branch:[],error:null,url:null},Ce=!1,ue=!1,He=!0,ne=!1,X=!1,ft=!1,De=!1,ut,R,I,F;const Z=new Set,Xe=new Map;async function Cn(e,t,n){globalThis.__sveltekit_172snbl?.data&&globalThis.__sveltekit_172snbl.data,document.URL!==location.href&&(location.href=location.href),A=e,await e.hooks.init?.(),xe=Dt(e),x=document.documentElement,Se=t,Re=e.nodes[0],ce=e.nodes[1],Re(),ce(),R=history.state?.[q],I=history.state?.[Q],R||(R=I=Date.now(),history.replaceState({...history.state,[q]:R,[Q]:I},""));const r=D[R];function a(){r&&(history.scrollRestoration="manual",scrollTo(r.x,r.y))}n?(a(),await Un(Se,n)):(await Y({type:"enter",url:Ne(A.hash?Ln(new URL(location.href)):location.href),replace_state:!0}),a()),In()}function wn(){le.length=0,De=!1}function dt(e){fe.some(t=>t?.snapshot)&&(te[e]=fe.map(t=>t?.snapshot?.capture()))}function ht(e){te[e]?.forEach((t,n)=>{fe[n]?.snapshot?.restore(t)})}function ze(){Oe(R),qe(tt,D),dt(I),qe(et,te)}async function pt(e,t,n,r){let a;t.invalidateAll&&Ie(),await Y({type:"goto",url:Ne(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:r,accept:()=>{t.invalidateAll&&(De=!0,a=[...Xe.keys()]),t.invalidate&&t.invalidate.forEach(Sn)}}),t.invalidateAll&&oe().then(oe).then(()=>{Xe.forEach(({resource:s},o)=>{a?.includes(o)&&s.refresh?.()})})}async function yn(e){if(e.id!==L?.id){Ie();const t={};Z.add(t),L={id:e.id,token:t,promise:gt({...e,preload:t}).then(n=>(Z.delete(t),n.type==="loaded"&&n.state.error&&Ie(),n)),fork:null}}return L.promise}async function Ae(e){const t=(await me(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(n=>n[1]()))}async function _t(e,t,n){const r={params:w.params,route:{id:w.route?.id??null},url:new URL(location.href)};w={...e.state,nav:r};const a=document.querySelector("style[data-sveltekit]");if(a&&a.remove(),Object.assign(S,e.props.page),ut=new A.root({target:t,props:{...e.props,stores:C,components:fe},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),ht(I),n){const s={from:null,to:{...r,scroll:D[R]??M()},willUnload:!1,type:"enter",complete:Promise.resolve()};J.forEach(o=>o(s))}ue=!0}async function de({url:e,params:t,branch:n,errors:r,status:a,error:s,route:o,form:c}){let i="never";if(U&&(e.pathname===U||e.pathname===U+"/"))i="always";else for(const f of n)f?.slash!==void 0&&(i=f.slash);e.pathname=Et(e.pathname,i),e.search=e.search;const l={type:"loaded",state:{url:e,params:t,branch:n,error:s,route:o},props:{constructors:on(n).map(f=>f.node.component),page:Me(S)}};c!==void 0&&(l.props.form=c);let u={},d=!S,p=0;for(let f=0;f<Math.max(n.length,w.branch.length);f+=1){const g=n[f],b=w.branch[f];g?.data!==b?.data&&(d=!0),g&&(u={...u,...g.data},d&&(l.props[`data_${p}`]=u),p+=1)}return(!w.url||e.href!==w.url.href||w.error!==s||c!==void 0&&c!==S.form||d)&&(l.props.page={error:s,params:t,route:{id:o?.id??null},state:{},status:a,url:new URL(e),form:c??null,data:d?u:S.data}),l}async function $e({loader:e,parent:t,url:n,params:r,route:a,server_data_node:s}){let o=null;const c={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},i=await e();return{node:i,loader:e,server:s,universal:i.universal?.load?{type:"data",data:o,uses:c}:null,data:o??s?.data??null,slash:i.universal?.trailingSlash??s?.slash}}function vn(e,t,n){let r=e instanceof Request?e.url:e;const a=new URL(r,n);a.origin===n.origin&&(r=a.href.slice(n.origin.length));const s=ue?Pt(r,a.href,t):Lt(r,t);return{resolved:a,promise:s}}function Je(e,t,n,r,a,s){if(De)return!0;if(!a)return!1;if(a.parent&&e||a.route&&t||a.url&&n)return!0;for(const o of a.search_params)if(r.has(o))return!0;for(const o of a.params)if(s[o]!==w.params[o])return!0;for(const o of a.dependencies)if(le.some(c=>c(new URL(o))))return!0;return!1}function Be(e,t){return e?.type==="data"?e:e?.type==="skip"?t??null:null}function bn(e,t){if(!e)return new Set(t.searchParams.keys());const n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(const r of n){const a=e.searchParams.getAll(r),s=t.searchParams.getAll(r);a.every(o=>s.includes(o))&&s.every(o=>a.includes(o))&&n.delete(r)}return n}function Ze({error:e,url:t,route:n,params:r}){return{type:"loaded",state:{error:e,url:t,route:n,params:r,branch:[]},props:{page:Me(S),constructors:[]}}}async function gt({id:e,invalidating:t,url:n,params:r,route:a,preload:s}){if(L?.id===e)return Z.delete(L.token),L.promise;const{errors:o,layouts:c,leaf:i}=a,l=[...c,i];o.forEach(m=>m?.().catch(()=>{})),l.forEach(m=>m?.[1]().catch(()=>{}));let u=null;const d=w.url?e!==he(w.url):!1,p=w.route?a.id!==w.route.id:!1,h=bn(w.url,n);let f=!1;{const m=l.map((y,E)=>{const k=w.branch[E],v=!!y?.[0]&&(k?.loader!==y[1]||Je(f,p,d,h,k.server?.uses,r));return v&&(f=!0),v});if(m.some(Boolean)){try{u=await yt(n,m)}catch(y){const E=await G(y,{url:n,params:r,route:{id:e}});return Z.has(s)?Ze({error:E,url:n,params:r,route:a}):ge({status:ie(y),error:E,url:n,route:a})}if(u.type==="redirect")return u}}const g=u?.nodes;let b=!1;const _=l.map(async(m,y)=>{if(!m)return;const E=w.branch[y],k=g?.[y];if((!k||k.type==="skip")&&m[1]===E?.loader&&!Je(b,p,d,h,E.universal?.uses,r))return E;if(b=!0,k?.type==="error")throw k;return $e({loader:m[1],url:n,params:r,route:a,parent:async()=>{const O={};for(let $=0;$<y;$+=1)Object.assign(O,(await _[$])?.data);return O},server_data_node:Be(k===void 0&&m[0]?{type:"skip"}:k??null,m[0]?E?.server:void 0)})});for(const m of _)m.catch(()=>{});const T=[];for(let m=0;m<l.length;m+=1)if(l[m])try{T.push(await _[m])}catch(y){if(y instanceof Le)return{type:"redirect",location:y.location};if(Z.has(s))return Ze({error:await G(y,{params:r,url:n,route:{id:a.id}}),url:n,params:r,route:a});let E=ie(y),k;if(g?.includes(y))E=y.status??E,k=y.error;else if(y instanceof pe)k=y.body;else{if(await C.updated.check())return await ct(),await K(n);k=await G(y,{params:r,url:n,route:{id:a.id}})}const v=await An(m,T,o);return v?de({url:n,params:r,branch:T.slice(0,v.idx).concat(v.node),errors:o,status:E,error:k,route:a}):await wt(n,{id:a.id},k,E)}else T.push(void 0);return de({url:n,params:r,branch:T,errors:o,status:200,error:null,route:a,form:t?void 0:null})}async function An(e,t,n){for(;e--;)if(n[e]){let r=e;for(;!t[r];)r-=1;try{return{idx:r+1,node:{node:await n[e](),loader:n[e],data:{},server:null,universal:null}}}catch{continue}}}async function ge({status:e,error:t,url:n,route:r}){const a={};let s=null;if(A.server_loads[0]===0)try{const c=await yt(n,[!0]);if(c.type!=="data"||c.nodes[0]&&c.nodes[0].type!=="data")throw 0;s=c.nodes[0]??null}catch{(n.origin!==re||n.pathname!==location.pathname||Ce)&&await K(n)}try{const o=await $e({loader:Re,url:n,params:a,route:r,parent:()=>Promise.resolve({}),server_data_node:Be(s)}),c={node:await ce(),loader:ce,universal:null,server:null,data:null};return de({url:n,params:a,branch:[o,c],status:e,error:t,errors:[],route:null})}catch(o){if(o instanceof Le)return pt(new URL(o.location,location.href),{},0);throw o}}async function En(e){const t=e.href;if(ae.has(t))return ae.get(t);let n;try{const r=(async()=>{let a=await A.hooks.reroute({url:new URL(e),fetch:async(s,o)=>vn(s,o,e).promise})??e;if(typeof a=="string"){const s=new URL(e);A.hash?s.hash=a:s.pathname=a,a=s}return a})();ae.set(t,r),n=await r}catch{ae.delete(t);return}return n}async function me(e,t){if(e&&!_e(e,U,A.hash)){const n=await En(e);if(!n)return;const r=kn(n);for(const a of xe){const s=a.exec(r);if(s)return{id:he(e),invalidating:t,route:a,params:Rt(s),url:e}}}}function kn(e){return kt(A.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(U.length))||"/"}function he(e){return(A.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function mt({url:e,type:t,intent:n,delta:r,event:a,scroll:s}){let o=!1;const c=Fe(w,n,e,t,s??null);r!==void 0&&(c.navigation.delta=r),a!==void 0&&(c.navigation.event=a);const i={...c.navigation,cancel:()=>{o=!0,c.reject(new Error("navigation cancelled"))}};return ne||lt.forEach(l=>l(i)),o?null:c}async function Y({type:e,url:t,popped:n,keepfocus:r,noscroll:a,replace_state:s,state:o={},redirect_count:c=0,nav_token:i={},accept:l=We,block:u=We,event:d}){const p=F;F=i;const h=await me(t,!1),f=e==="enter"?Fe(w,h,t,e):mt({url:t,type:e,delta:n?.delta,intent:h,scroll:n?.scroll,event:d});if(!f){u(),F===i&&(F=p);return}const g=R,b=I;l(),ne=!0,ue&&f.navigation.type!=="enter"&&C.navigating.set(ee.current=f.navigation);let _=h&&await gt(h);if(!_){if(_e(t,U,A.hash))return await K(t,s);_=await wt(t,{id:null},await G(new Pe(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,s)}if(t=h?.url||t,F!==i)return f.reject(new Error("navigation aborted")),!1;if(_.type==="redirect"){if(c<20){await Y({type:e,url:new URL(_.location,t),popped:n,keepfocus:r,noscroll:a,replace_state:s,state:o,redirect_count:c+1,nav_token:i}),f.fulfil(void 0);return}_=await ge({status:500,error:await G(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}})}else _.props.page.status>=400&&await C.updated.check()&&(await ct(),await K(t,s));if(wn(),Oe(g),dt(b),_.props.page.url.pathname!==t.pathname&&(t.pathname=_.props.page.url.pathname),o=n?n.state:o,!n){const v=s?0:1,O={[q]:R+=v,[Q]:I+=v,[nt]:o};(s?history.replaceState:history.pushState).call(history,O,"",t),s||gn(R,I)}const T=h&&L?.id===h.id?L.fork:null;L=null,_.props.page.state=o;let m;if(ue){const v=(await Promise.all(Array.from(mn,W=>W(f.navigation)))).filter(W=>typeof W=="function");if(v.length>0){let W=function(){v.forEach(we=>{J.delete(we)})};v.push(W),v.forEach(we=>{J.add(we)})}const O=f.navigation.to;w={..._.state,nav:{params:O.params,route:O.route,url:O.url}},_.props.page&&(_.props.page.url=t);const $=T&&await T;$?m=$.commit():(H=null,ut.$set(_.props),H&&Object.assign(_.props.page,H),un(_.props.page),m=At?.()),ft=!0}else await _t(_,Se,!1);const{activeElement:y}=document;await m,await oe(),await oe();let E=null;if(He){const v=n?n.scroll:a?M():null;v?scrollTo(v.x,v.y):(E=t.hash&&document.getElementById(bt(t)))?E.scrollIntoView():scrollTo(0,0)}const k=document.activeElement!==y&&document.activeElement!==document.body;!r&&!k&&Tn(t,!E),He=!0,_.props.page&&(H&&Object.assign(_.props.page,H),Object.assign(S,_.props.page)),ne=!1,e==="popstate"&&ht(I),f.fulfil(void 0),f.navigation.to&&(f.navigation.to.scroll=M()),J.forEach(v=>v(f.navigation)),C.navigating.set(ee.current=null)}async function wt(e,t,n,r,a){return e.origin===re&&e.pathname===location.pathname&&!Ce?await ge({status:r,error:n,url:e,route:t}):await K(e,a)}function Rn(){let e,t={element:void 0,href:void 0},n;x.addEventListener("mousemove",c=>{const i=c.target;clearTimeout(e),e=setTimeout(()=>{s(i,B.hover)},20)});function r(c){c.defaultPrevented||s(c.composedPath()[0],B.tap)}x.addEventListener("mousedown",r),x.addEventListener("touchstart",r,{passive:!0});const a=new IntersectionObserver(c=>{for(const i of c)i.isIntersecting&&(Ae(new URL(i.target.href)),a.unobserve(i.target))},{threshold:0});async function s(c,i){const l=at(c,x),u=l===t.element&&l?.href===t.href&&i>=n;if(!l||u)return;const{url:d,external:p,download:h}=Ee(l,U,A.hash);if(p||h)return;const f=se(l),g=d&&he(w.url)===he(d);if(!(f.reload||g))if(i<=f.preload_data){t={element:l,href:l.href},n=B.tap;const b=await me(d,!1);if(!b)return;yn(b)}else i<=f.preload_code&&(t={element:l,href:l.href},n=i,Ae(d))}function o(){a.disconnect();for(const c of x.querySelectorAll("a")){const{url:i,external:l,download:u}=Ee(c,U,A.hash);if(l||u)continue;const d=se(c);d.reload||(d.preload_code===B.viewport&&a.observe(c),d.preload_code===B.eager&&Ae(i))}}J.add(o),o()}function G(e,t){if(e instanceof pe)return e.body;const n=ie(e),r=ln(e);return A.hooks.handleError({error:e,event:t,status:n,message:r})??{message:r}}function Dn(e,t={}){return e=new URL(Ne(e)),e.origin!==re?Promise.reject(new Error("goto: invalid URL")):pt(e,t,0)}function Sn(e){if(typeof e=="function")le.push(e);else{const{href:t}=new URL(e,location.href);le.push(n=>n.href===t)}}function In(){history.scrollRestoration="manual",addEventListener("beforeunload",t=>{let n=!1;if(ze(),!ne){const r=Fe(w,void 0,null,"leave"),a={...r.navigation,cancel:()=>{n=!0,r.reject(new Error("navigation cancelled"))}};lt.forEach(s=>s(a))}n?(t.preventDefault(),t.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&ze()}),navigator.connection?.saveData||Rn(),x.addEventListener("click",async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;const n=at(t.composedPath()[0],x);if(!n)return;const{url:r,external:a,target:s,download:o}=Ee(n,U,A.hash);if(!r)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const c=se(n);if(!(n instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||o)return;const[l,u]=(A.hash?r.hash.replace(/^#/,""):r.href).split("#"),d=l===ye(location);if(a||c.reload&&(!d||!u)){mt({url:r,type:"link",event:t})?ne=!0:t.preventDefault();return}if(u!==void 0&&d){const[,p]=w.url.href.split("#");if(p===u){if(t.preventDefault(),u===""||u==="top"&&n.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const h=n.ownerDocument.getElementById(decodeURIComponent(u));h&&(h.scrollIntoView(),h.focus())}return}if(X=!0,Oe(R),e(r),!c.replace_state)return;X=!1}t.preventDefault(),await new Promise(p=>{requestAnimationFrame(()=>{setTimeout(p,0)}),setTimeout(p,100)}),await Y({type:"link",url:r,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??r.href===location.href,event:t})}),x.addEventListener("submit",t=>{if(t.defaultPrevented)return;const n=HTMLFormElement.prototype.cloneNode.call(t.target),r=t.submitter;if((r?.formTarget||n.target)==="_blank"||(r?.formMethod||n.method)!=="get")return;const o=new URL(r?.hasAttribute("formaction")&&r?.formAction||n.action);if(_e(o,U,!1))return;const c=t.target,i=se(c);if(i.reload)return;t.preventDefault(),t.stopPropagation();const l=new FormData(c,r);o.search=new URLSearchParams(l).toString(),Y({type:"form",url:o,keepfocus:i.keepfocus,noscroll:i.noscroll,replace_state:i.replace_state??o.href===location.href,event:t})}),addEventListener("popstate",async t=>{if(!Ue){if(t.state?.[q]){const n=t.state[q];if(F={},n===R)return;const r=D[n],a=t.state[nt]??{},s=new URL(t.state[Ft]??location.href),o=t.state[Q],c=w.url?ye(location)===ye(w.url):!1;if(o===I&&(ft||c)){a!==S.state&&(S.state=a),e(s),D[R]=M(),r&&scrollTo(r.x,r.y),R=n;return}const l=n-R;await Y({type:"popstate",url:s,popped:{state:a,scroll:r,delta:l},accept:()=>{R=n,I=o},block:()=>{history.go(-l)},nav_token:F,event:t})}else if(!X){const n=new URL(location.href);e(n),A.hash&&location.reload()}}}),addEventListener("hashchange",()=>{X&&(X=!1,history.replaceState({...history.state,[q]:++R,[Q]:I},"",location.href))});for(const t of document.querySelectorAll("link"))_n.has(t.rel)&&(t.href=t.href);addEventListener("pageshow",t=>{t.persisted&&C.navigating.set(ee.current=null)});function e(t){w.url=S.url=t,C.page.set(Me(S)),C.page.notify()}}async function Un(e,{status:t=200,error:n,node_ids:r,params:a,route:s,server_route:o,data:c,form:i}){Ce=!0;const l=new URL(location.href);let u;({params:a={},route:s={id:null}}=await me(l,!1)||{}),u=xe.find(({id:h})=>h===s.id);let d,p=!0;try{const h=r.map(async(g,b)=>{const _=c[b];return _?.uses&&(_.uses=vt(_.uses)),$e({loader:A.nodes[g],url:l,params:a,route:s,parent:async()=>{const T={};for(let m=0;m<b;m+=1)Object.assign(T,(await h[m]).data);return T},server_data_node:Be(_)})}),f=await Promise.all(h);if(u){const g=u.layouts;for(let b=0;b<g.length;b++)g[b]||f.splice(b,0,void 0)}d=await de({url:l,params:a,branch:f,status:t,error:n,errors:u?.errors,form:i,route:u??null})}catch(h){if(h instanceof Le){await K(new URL(h.location,location.href));return}d=await ge({status:ie(h),error:await G(h,{url:l,params:a,route:s}),url:l,route:s}),e.textContent="",p=!1}d.props.page&&(d.props.page.state={}),await _t(d,e,p)}async function yt(e,t){const n=new URL(e);n.pathname=pn(e.pathname),e.pathname.endsWith("/")&&n.searchParams.append(cn,"1"),n.searchParams.append(sn,t.map(s=>s?"1":"0").join(""));const r=window.fetch,a=await r(n.href,{});if(!a.ok){let s;throw a.headers.get("content-type")?.includes("application/json")?s=await a.json():a.status===404?s="Not Found":a.status===500&&(s="Internal Error"),new pe(a.status,s)}return new Promise(async s=>{const o=new Map,c=a.body.getReader();function i(u){return rn(u,{...A.decoders,Promise:d=>new Promise((p,h)=>{o.set(d,{fulfil:p,reject:h})})})}let l="";for(;;){const{done:u,value:d}=await c.read();if(u&&!l)break;for(l+=!d&&l?`
2
- `:It.decode(d,{stream:!0});;){const p=l.indexOf(`
3
- `);if(p===-1)break;const h=JSON.parse(l.slice(0,p));if(l=l.slice(p+1),h.type==="redirect")return s(h);if(h.type==="data")h.nodes?.forEach(f=>{f?.type==="data"&&(f.uses=vt(f.uses),f.data=i(f.data))}),s(h);else if(h.type==="chunk"){const{id:f,data:g,error:b}=h,_=o.get(f);o.delete(f),b?_.reject(i(b)):_.fulfil(i(g))}}}})}function vt(e){return{dependencies:new Set(e?.dependencies??[]),params:new Set(e?.params??[]),parent:!!e?.parent,route:!!e?.route,url:!!e?.url,search_params:new Set(e?.search_params??[])}}let Ue=!1;function Tn(e,t=!0){const n=document.querySelector("[autofocus]");if(n)n.focus();else{const r=bt(e);if(r&&document.getElementById(r)){const{x:s,y:o}=M();setTimeout(()=>{const c=history.state;Ue=!0,location.replace(new URL(`#${r}`,location.href)),history.replaceState(c,"",e),t&&scrollTo(s,o),Ue=!1})}else{const s=document.body,o=s.getAttribute("tabindex");s.tabIndex=-1,s.focus({preventScroll:!0,focusVisible:!1}),o!==null?s.setAttribute("tabindex",o):s.removeAttribute("tabindex")}const a=getSelection();if(a&&a.type!=="None"){const s=[];for(let o=0;o<a.rangeCount;o+=1)s.push(a.getRangeAt(o));setTimeout(()=>{if(a.rangeCount===s.length){for(let o=0;o<a.rangeCount;o+=1){const c=s[o],i=a.getRangeAt(o);if(c.commonAncestorContainer!==i.commonAncestorContainer||c.startContainer!==i.startContainer||c.endContainer!==i.endContainer||c.startOffset!==i.startOffset||c.endOffset!==i.endOffset)return}a.removeAllRanges()}})}}}function Fe(e,t,n,r,a=null){let s,o;const c=new Promise((l,u)=>{s=l,o=u});return c.catch(()=>{}),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:M()},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n,scroll:a},willUnload:!t,type:r,complete:c},fulfil:s,reject:o}}function Me(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Ln(e){const t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function bt(e){let t;if(A.hash){const[,,n]=e.hash.split("#",3);t=n??""}else t=e.hash.slice(1);return decodeURIComponent(t)}export{Cn as a,Dn as g,jn as l,S as p,C as s};
@@ -1 +0,0 @@
1
- import{l as o,a as r}from"../chunks/C9URPhwn.js";export{o as load_css,r as start};
@@ -1,2 +0,0 @@
1
- )�import{l as o,a as r}from"../chunks/C9URPhwn.js";export{o as load_css,r as start};
2
- 
@@ -1 +0,0 @@
1
- {"version":3,"file":"_server.ts-BBLuxvp6.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/response/_server.ts.js"],"sourcesContent":["import { a as cleanup, g as getDecision, s as setDecision } from \"../../../../chunks/pending-requests.js\";\nimport { v as validateAuth } from \"../../../../chunks/auth.js\";\nimport { t as toErrorMessage } from \"../../../../chunks/error.js\";\nimport { json } from \"@sveltejs/kit\";\nconst POST = async ({ request }) => {\n cleanup();\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n let body;\n try {\n body = await request.json();\n } catch {\n return json({ error: \"Invalid JSON in request body\" }, { status: 400 });\n }\n try {\n const { decision, requestId } = body;\n if (!requestId || !decision) {\n return json({ error: \"requestId and decision are required\" }, { status: 400 });\n }\n if (decision !== \"allow\" && decision !== \"deny\") {\n return json({ error: 'decision must be \"allow\" or \"deny\"' }, { status: 400 });\n }\n const found = setDecision(requestId, decision);\n if (!found) {\n return json({ error: \"Request not found or expired\" }, { status: 404 });\n }\n console.log(`[response] Decision received: ${decision} for request ${requestId}`);\n return json({\n message: \"Decision recorded\",\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n } catch (error) {\n console.error(\"[response] Failed to process response:\", toErrorMessage(error));\n return json({ error: \"Failed to process response\" }, { status: 500 });\n }\n};\nconst GET = ({ request, url }) => {\n cleanup();\n const authErr = validateAuth(request);\n if (authErr) {\n return authErr;\n }\n const requestId = url.searchParams.get(\"requestId\");\n if (!requestId) {\n return json({ error: \"requestId query parameter is required\" }, { status: 400 });\n }\n const result = getDecision(requestId);\n if (result.status === \"not_found\") {\n return json({ error: \"Request not found or expired\" }, { status: 404 });\n }\n return json({\n decision: result.decision ?? null,\n status: result.status,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n};\nexport {\n GET,\n POST\n};\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"_server.ts-HGYjOWF2.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/notify/_server.ts.js"],"sourcesContent":["import { b as private_env } from \"../../../../chunks/shared-server.js\";\nimport { L as LibraryAPNsService } from \"../../../../chunks/library-apns.js\";\nimport { c as createPendingRequest } from \"../../../../chunks/pending-requests.js\";\nimport { v as validateAuth } from \"../../../../chunks/auth.js\";\nimport admin from \"firebase-admin\";\nimport { t as toErrorMessage } from \"../../../../chunks/error.js\";\nimport { b as broadcastEvent } from \"../../../../chunks/events-handler.js\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { json } from \"@sveltejs/kit\";\nimport { homedir } from \"os\";\nconst MAX_HISTORY = 100;\nconst history = [];\nfunction addNotification(record) {\n history.unshift(record);\n if (history.length > MAX_HISTORY) {\n history.length = MAX_HISTORY;\n }\n}\nfunction getNotifications(limit = 50) {\n return history.slice(0, limit);\n}\nlet app = null;\nfunction isFCMConfigured() {\n return !!(process.env.FCM_PROJECT_ID && process.env.FCM_CLIENT_EMAIL && process.env.FCM_PRIVATE_KEY);\n}\nasync function sendFCMNotification(deviceToken, payload) {\n try {\n const fcmApp = getApp();\n const message = {\n android: {\n priority: \"high\",\n // Ensures delivery even in Doze mode\n ttl: 3e5\n // 5 minutes TTL (matches pending request expiry)\n },\n data: {\n body: payload.body || payload.message || \"\",\n category: payload.category ?? (typeof payload.data?.category === \"string\" ? payload.data.category : \"\"),\n project: typeof payload.data?.project === \"string\" ? payload.data.project : \"\",\n requestId: typeof payload.data?.requestId === \"string\" ? payload.data.requestId : \"\",\n source: typeof payload.data?.source === \"string\" ? payload.data.source : \"\",\n subtitle: payload.subtitle ?? \"\",\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n title: payload.title,\n toolInput: payload.data?.toolInput ? JSON.stringify(payload.data.toolInput) : \"\",\n toolName: typeof payload.data?.toolName === \"string\" ? payload.data.toolName : \"\",\n type: typeof payload.data?.type === \"string\" ? payload.data.type : \"\"\n },\n token: deviceToken\n };\n const messageId = await admin.messaging(fcmApp).send(message);\n return { messageId, success: true };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(\"[FCM] Send failed:\", errorMessage);\n return { error: errorMessage, success: false };\n }\n}\nfunction getApp() {\n if (!app) {\n const projectId = process.env.FCM_PROJECT_ID;\n const clientEmail = process.env.FCM_CLIENT_EMAIL;\n const privateKey = process.env.FCM_PRIVATE_KEY?.replace(/\\\\n/g, \"\\n\");\n if (!projectId || !clientEmail || !privateKey) {\n throw new Error(\n \"FCM not configured: missing FCM_PROJECT_ID, FCM_CLIENT_EMAIL, or FCM_PRIVATE_KEY\"\n );\n }\n app = admin.initializeApp({\n credential: admin.credential.cert({ clientEmail, privateKey, projectId })\n });\n }\n return app;\n}\nfunction readPersistedDeviceToken(platform) {\n const tokensFile = join(homedir(), \".shooter\", \"device-tokens.json\");\n if (!existsSync(tokensFile)) {\n return void 0;\n }\n try {\n const parsed = JSON.parse(readFileSync(tokensFile, \"utf-8\"));\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const value = parsed[platform];\n return typeof value === \"string\" && value ? value : void 0;\n }\n } catch {\n }\n return void 0;\n}\nlet apnsSingleton = null;\nfunction getAPNsClient() {\n if (!apnsSingleton) {\n apnsSingleton = new LibraryAPNsService();\n }\n return apnsSingleton;\n}\nconst notificationCache = /* @__PURE__ */ new Map();\nconst DEDUP_WINDOW = 1e4;\nfunction broadcastHookEvent(body) {\n const data = body.data ?? {};\n const eventType = typeof data.eventType === \"string\" ? data.eventType : typeof body.eventType === \"string\" ? body.eventType : \"\";\n const tool = typeof data.tool === \"string\" ? data.tool : \"\";\n const terminalId = typeof data.terminalId === \"string\" ? data.terminalId : void 0;\n const sessionId = typeof data.sessionId === \"string\" ? data.sessionId : void 0;\n switch (eventType) {\n case \"error\":\n broadcastEvent({\n error: typeof data.error === \"string\" ? data.error : typeof data.message === \"string\" ? data.message : \"Unknown error\",\n terminalId,\n tool,\n type: \"tool-failed\"\n });\n break;\n case \"idle_input\":\n case \"session.idle\":\n broadcastEvent({\n message: typeof data.message === \"string\" ? data.message : \"\",\n sessionId,\n terminalId,\n type: \"agent-idle\"\n });\n break;\n case \"permission\":\n case \"permission_notification\":\n if (data.requestId && data.toolName) {\n broadcastEvent({\n input: typeof data.toolInput === \"object\" && data.toolInput !== null ? data.toolInput : {},\n requestId: data.requestId,\n tool: data.toolName,\n type: \"permission-requested\"\n });\n }\n break;\n case \"question\":\n broadcastEvent({\n message: typeof data.message === \"string\" ? data.message : \"\",\n sessionId,\n terminalId,\n type: \"agent-question\"\n });\n break;\n case \"tool.after\":\n broadcastEvent({ success: true, terminalId, tool, type: \"tool-completed\" });\n break;\n case \"tool.before\":\n broadcastEvent({\n command: typeof data.command === \"string\" ? data.command : \"\",\n filePath: typeof data.filePath === \"string\" ? data.filePath : typeof data.files === \"string\" ? data.files : \"\",\n terminalId,\n tool,\n type: \"tool-started\"\n });\n break;\n }\n}\nfunction buildNotificationRecord(id, title, message, status, data, error) {\n return {\n category: data?.category ?? null,\n data: data ?? null,\n error: error ?? null,\n id,\n message,\n project: data?.project ?? null,\n source: data?.source ?? null,\n status,\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n title,\n tool: data?.tool ?? null\n };\n}\nfunction intelligentNotificationFilter(title, message, data, waitForResponse = false) {\n const source = data?.source || \"unknown\";\n if (isDuplicateNotification(title, message, data, waitForResponse)) {\n return {\n reason: \"Duplicate notification within 10-second window\",\n send: false\n };\n }\n if (source === \"smart-completion-detector\" || source === \"shooter-completion-detector\") {\n return {\n reason: \"Smart completion detector - completion or intervention needed\",\n send: true\n };\n }\n if (source === \"stop-hook\") {\n return {\n reason: \"Stop hook completion notification - session finished\",\n send: true\n };\n }\n const spamPatterns = [\n /PreToolUse/i,\n // Any PreToolUse notifications\n /PostToolUse/i,\n // Any PostToolUse notifications\n /^(Read|Write|Edit|Bash)\\s+Starting\\s*\\|\\s*\\w+$/i,\n // Only basic tool starting patterns\n /^unknown\\s*\\|\\s*\\w+$/i\n // Only \"unknown | projectname\" exactly\n ];\n const isSpam = spamPatterns.some((pattern) => pattern.test(title) || pattern.test(message));\n if (isSpam) {\n return {\n reason: \"Filtered spam notification from old hook system\",\n send: false\n };\n }\n const importantPatterns = [\n /session complete/i,\n /intervention needed/i,\n /error/i,\n /failed/i,\n /blocked/i,\n /attention/i\n ];\n const isImportant = importantPatterns.some(\n (pattern) => pattern.test(title) || pattern.test(message)\n );\n if (isImportant) {\n return {\n reason: \"Important notification - completion or intervention\",\n send: true\n };\n }\n return {\n reason: \"General notification - allowing by default\",\n send: true\n };\n}\nfunction isDuplicateNotification(title, message, data, waitForResponse = false) {\n if (waitForResponse) {\n return false;\n }\n const key = `${title}|${message}|${data?.category || \"unknown\"}`;\n const now = Date.now();\n if (notificationCache.has(key)) {\n const lastSent = notificationCache.get(key) ?? 0;\n if (now - lastSent < DEDUP_WINDOW) {\n return true;\n }\n }\n for (const [k, v] of notificationCache.entries()) {\n if (now - v > DEDUP_WINDOW) {\n notificationCache.delete(k);\n }\n }\n return false;\n}\nfunction recordNotification(title, message, data) {\n const key = `${title}|${message}|${data?.category || \"unknown\"}`;\n notificationCache.set(key, Date.now());\n}\nconst POST = async ({ request }) => {\n try {\n const apnsClient = getAPNsClient();\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n const rawBody = await request.json();\n if (!rawBody || typeof rawBody !== \"object\" || Array.isArray(rawBody)) {\n return json({ error: \"Request body must be a JSON object\" }, { status: 400 });\n }\n const body = rawBody;\n const data = body.data;\n const requestDeviceToken = body.deviceToken;\n const message = body.message;\n const title = body.title;\n const subtitle = typeof body.subtitle === \"string\" ? body.subtitle : void 0;\n const skipPush = typeof body.skipPush === \"boolean\" ? body.skipPush : false;\n const waitForResponse = typeof body.waitForResponse === \"boolean\" ? body.waitForResponse : false;\n try {\n broadcastHookEvent(body);\n } catch {\n }\n if (!title || typeof title !== \"string\" || !message || typeof message !== \"string\") {\n return json({ error: \"Title and message are required and must be strings\" }, { status: 400 });\n }\n if (requestDeviceToken !== void 0 && typeof requestDeviceToken !== \"string\") {\n return json({ error: \"deviceToken must be a string\" }, { status: 400 });\n }\n const requestId = Math.random().toString(36).substring(2, 15);\n const dataRequestId = typeof data?.requestId === \"string\" ? data.requestId : void 0;\n const canonicalRequestId = dataRequestId || requestId;\n const shouldSendNotification = intelligentNotificationFilter(\n title,\n message,\n data,\n waitForResponse\n );\n if (!shouldSendNotification.send) {\n addNotification(\n buildNotificationRecord(\n canonicalRequestId,\n title,\n message,\n \"filtered\",\n data,\n shouldSendNotification.reason\n )\n );\n return json({\n message: \"Notification filtered (not sent)\",\n reason: shouldSendNotification.reason,\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n }\n if (skipPush) {\n if (waitForResponse) {\n createPendingRequest(canonicalRequestId, {\n sessionId: data?.sessionId || \"\",\n toolInput: data?.toolInput || {},\n toolName: data?.toolName || \"\"\n });\n }\n addNotification(buildNotificationRecord(canonicalRequestId, title, message, \"skipped\", data));\n return json({\n message: \"Push skipped (WebSocket clients connected)\",\n requestId: canonicalRequestId,\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n }\n const payload = {\n badge: 1,\n body: message,\n category: waitForResponse ? \"CLAUDE_PERMISSION\" : void 0,\n data: {\n ...data,\n requestId: canonicalRequestId,\n source: \"modern-apns-api\",\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n waitForResponse: waitForResponse || false\n },\n message: null,\n sound: \"default\",\n ...subtitle ? { subtitle } : {},\n title\n };\n const platform = private_env.DEVICE_PLATFORM || \"ios\";\n if (platform === \"android\") {\n if (!isFCMConfigured()) {\n return json(\n {\n details: \"Missing FCM_PROJECT_ID, FCM_CLIENT_EMAIL, or FCM_PRIVATE_KEY environment variables\",\n error: \"FCM not configured\"\n },\n { status: 500 }\n );\n }\n const androidToken = requestDeviceToken?.trim() || private_env.ANDROID_DEVICE_TOKEN?.trim() || readPersistedDeviceToken(\"android\");\n if (!androidToken) {\n return json(\n {\n details: \"No Android device token available — set ANDROID_DEVICE_TOKEN, pass deviceToken in the request body, or open the Android app so it can auto-register its FCM token.\",\n error: \"No device token configured\"\n },\n { status: 500 }\n );\n }\n const fcmResult = await sendFCMNotification(androidToken, payload);\n if (fcmResult.success) {\n recordNotification(title, message, data);\n if (waitForResponse) {\n createPendingRequest(canonicalRequestId, {\n sessionId: data?.sessionId || \"\",\n toolInput: data?.toolInput || {},\n toolName: data?.toolName || \"\"\n });\n }\n addNotification(buildNotificationRecord(canonicalRequestId, title, message, \"sent\", data));\n return json({\n message: \"Notification sent successfully\",\n requestId: canonicalRequestId,\n result: { messageId: fcmResult.messageId },\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n } else {\n console.error(`[notify] FCM delivery failed: ${fcmResult.error}`);\n addNotification(\n buildNotificationRecord(\n canonicalRequestId,\n title,\n message,\n \"failed\",\n data,\n fcmResult.error\n )\n );\n return json(\n {\n details: fcmResult.error,\n error: \"Failed to send notification\",\n requestId: canonicalRequestId,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n },\n { status: 500 }\n );\n }\n } else {\n if (!apnsClient.isConfigured()) {\n return json(\n {\n details: \"Missing APNS_KEY, APNS_KEY_ID, or APNS_TEAM_ID environment variables\",\n error: \"APNs client not configured\"\n },\n { status: 500 }\n );\n }\n const deviceToken = requestDeviceToken?.trim() || private_env.DEVICE_TOKEN?.trim();\n if (!deviceToken) {\n return json(\n {\n details: \"DEVICE_TOKEN environment variable is missing and no deviceToken in request body\",\n error: \"No device token configured\"\n },\n { status: 500 }\n );\n }\n try {\n const result = await apnsClient.sendNotification(deviceToken, payload);\n recordNotification(title, message, data);\n if (waitForResponse) {\n createPendingRequest(canonicalRequestId, {\n sessionId: data?.sessionId || \"\",\n toolInput: data?.toolInput || {},\n toolName: data?.toolName || \"\"\n });\n }\n addNotification(buildNotificationRecord(canonicalRequestId, title, message, \"sent\", data));\n return json({\n message: \"Notification sent successfully\",\n requestId: canonicalRequestId,\n result,\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n } catch (notificationError) {\n const notifErrMsg = toErrorMessage(notificationError);\n console.error(`[notify] APNs delivery failed: ${notifErrMsg}`);\n addNotification(\n buildNotificationRecord(canonicalRequestId, title, message, \"failed\", data, notifErrMsg)\n );\n return json(\n {\n details: notifErrMsg,\n error: \"Failed to send notification\",\n requestId: canonicalRequestId,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n },\n { status: 500 }\n );\n }\n }\n } catch (error) {\n console.error(\"Notification error:\", error);\n return json(\n {\n details: toErrorMessage(error),\n error: \"Failed to send notification\",\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n },\n { status: 500 }\n );\n }\n};\nconst GET = ({ request, url }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n const limit = parseInt(url.searchParams.get(\"limit\") || \"50\");\n const notifications = getNotifications(limit);\n return json({\n count: notifications.length,\n notifications,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n};\nexport {\n GET,\n POST\n};\n"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- import './state.svelte-M8y8rROy.js';
2
- import { s as stores } from './client-w1WsLDGu.js';
3
-
4
- ({
5
- check: stores.updated.check
6
- });
7
- //# sourceMappingURL=client2-B5wCRDQi.js.map
@@ -1,96 +0,0 @@
1
- import Database from 'better-sqlite3';
2
- import * as fs from 'fs';
3
- import * as path from 'path';
4
-
5
- const MAX_AGE_MS = 5 * 60 * 1e3;
6
- const DB_DIR = path.join(process.env.HOME || "", ".shooter");
7
- const DB_PATH = path.join(DB_DIR, "shooter.db");
8
- class PendingRequestsStore {
9
- db;
10
- constructor() {
11
- fs.mkdirSync(DB_DIR, { recursive: true });
12
- this.db = new Database(DB_PATH);
13
- this.db.pragma("journal_mode = WAL");
14
- this.db.exec(`
15
- CREATE TABLE IF NOT EXISTS pending_requests (
16
- request_id TEXT PRIMARY KEY,
17
- session_id TEXT NOT NULL,
18
- tool_name TEXT NOT NULL,
19
- tool_input TEXT NOT NULL DEFAULT '{}',
20
- decision TEXT,
21
- created_at INTEGER NOT NULL,
22
- decided_at INTEGER
23
- )
24
- `);
25
- }
26
- cleanup(maxAgeMs) {
27
- const cutoff = Date.now() - maxAgeMs;
28
- const result = this.db.prepare("DELETE FROM pending_requests WHERE created_at < ?").run(cutoff);
29
- return result.changes;
30
- }
31
- delete(requestId) {
32
- this.db.prepare("DELETE FROM pending_requests WHERE request_id = ?").run(requestId);
33
- }
34
- get(requestId) {
35
- const row = this.db.prepare("SELECT * FROM pending_requests WHERE request_id = ?").get(requestId);
36
- return row ? rowToRecord(row) : null;
37
- }
38
- insert(requestId, data) {
39
- this.db.prepare(
40
- `INSERT OR REPLACE INTO pending_requests
41
- (request_id, session_id, tool_name, tool_input, decision, created_at, decided_at)
42
- VALUES (?, ?, ?, ?, NULL, ?, NULL)`
43
- ).run(requestId, data.sessionId, data.toolName, JSON.stringify(data.toolInput), Date.now());
44
- }
45
- setDecision(requestId, decision) {
46
- const result = this.db.prepare("UPDATE pending_requests SET decision = ?, decided_at = ? WHERE request_id = ?").run(decision, Date.now(), requestId);
47
- return result.changes > 0;
48
- }
49
- }
50
- function rowToRecord(row) {
51
- let toolInput = {};
52
- if (typeof row.tool_input === "string" && row.tool_input.length > 0) {
53
- try {
54
- const parsed = JSON.parse(row.tool_input);
55
- if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
56
- toolInput = parsed;
57
- }
58
- } catch {
59
- }
60
- }
61
- return {
62
- createdAt: row.created_at,
63
- decidedAt: row.decided_at ?? null,
64
- decision: row.decision ?? null,
65
- sessionId: row.session_id,
66
- toolInput,
67
- toolName: row.tool_name
68
- };
69
- }
70
- const PR_GLOBAL_KEY = "__shooter_pending_requests_store";
71
- const pendingRequestsStore = globalThis[PR_GLOBAL_KEY] || new PendingRequestsStore();
72
- globalThis[PR_GLOBAL_KEY] = pendingRequestsStore;
73
- function cleanup(maxAgeMs = MAX_AGE_MS) {
74
- pendingRequestsStore.cleanup(maxAgeMs);
75
- }
76
- function createPendingRequest(requestId, data) {
77
- cleanup();
78
- pendingRequestsStore.insert(requestId, data);
79
- }
80
- function getDecision(requestId) {
81
- const entry = pendingRequestsStore.get(requestId);
82
- if (!entry) {
83
- return { status: "not_found" };
84
- }
85
- if (entry.decision) {
86
- pendingRequestsStore.delete(requestId);
87
- return { decision: entry.decision, status: "decided" };
88
- }
89
- return { status: "pending" };
90
- }
91
- function setDecision(requestId, decision) {
92
- return pendingRequestsStore.setDecision(requestId, decision);
93
- }
94
-
95
- export { cleanup as a, createPendingRequest as c, getDecision as g, setDecision as s };
96
- //# sourceMappingURL=pending-requests-B-JNGxpk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pending-requests-B-JNGxpk.js","sources":["../../../.svelte-kit/adapter-node/chunks/pending-requests.js"],"sourcesContent":["import Database from \"better-sqlite3\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nconst MAX_AGE_MS = 5 * 60 * 1e3;\nconst DB_DIR = path.join(process.env.HOME || \"\", \".shooter\");\nconst DB_PATH = path.join(DB_DIR, \"shooter.db\");\nclass PendingRequestsStore {\n db;\n constructor() {\n fs.mkdirSync(DB_DIR, { recursive: true });\n this.db = new Database(DB_PATH);\n this.db.pragma(\"journal_mode = WAL\");\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS pending_requests (\n request_id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n tool_name TEXT NOT NULL,\n tool_input TEXT NOT NULL DEFAULT '{}',\n decision TEXT,\n created_at INTEGER NOT NULL,\n decided_at INTEGER\n )\n `);\n }\n cleanup(maxAgeMs) {\n const cutoff = Date.now() - maxAgeMs;\n const result = this.db.prepare(\"DELETE FROM pending_requests WHERE created_at < ?\").run(cutoff);\n return result.changes;\n }\n delete(requestId) {\n this.db.prepare(\"DELETE FROM pending_requests WHERE request_id = ?\").run(requestId);\n }\n get(requestId) {\n const row = this.db.prepare(\"SELECT * FROM pending_requests WHERE request_id = ?\").get(requestId);\n return row ? rowToRecord(row) : null;\n }\n insert(requestId, data) {\n this.db.prepare(\n `INSERT OR REPLACE INTO pending_requests\n (request_id, session_id, tool_name, tool_input, decision, created_at, decided_at)\n VALUES (?, ?, ?, ?, NULL, ?, NULL)`\n ).run(requestId, data.sessionId, data.toolName, JSON.stringify(data.toolInput), Date.now());\n }\n setDecision(requestId, decision) {\n const result = this.db.prepare(\"UPDATE pending_requests SET decision = ?, decided_at = ? WHERE request_id = ?\").run(decision, Date.now(), requestId);\n return result.changes > 0;\n }\n}\nfunction rowToRecord(row) {\n let toolInput = {};\n if (typeof row.tool_input === \"string\" && row.tool_input.length > 0) {\n try {\n const parsed = JSON.parse(row.tool_input);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n toolInput = parsed;\n }\n } catch {\n }\n }\n return {\n createdAt: row.created_at,\n decidedAt: row.decided_at ?? null,\n decision: row.decision ?? null,\n sessionId: row.session_id,\n toolInput,\n toolName: row.tool_name\n };\n}\nconst PR_GLOBAL_KEY = \"__shooter_pending_requests_store\";\nconst pendingRequestsStore = globalThis[PR_GLOBAL_KEY] || new PendingRequestsStore();\nglobalThis[PR_GLOBAL_KEY] = pendingRequestsStore;\nfunction cleanup(maxAgeMs = MAX_AGE_MS) {\n pendingRequestsStore.cleanup(maxAgeMs);\n}\nfunction createPendingRequest(requestId, data) {\n cleanup();\n pendingRequestsStore.insert(requestId, data);\n}\nfunction getDecision(requestId) {\n const entry = pendingRequestsStore.get(requestId);\n if (!entry) {\n return { status: \"not_found\" };\n }\n if (entry.decision) {\n pendingRequestsStore.delete(requestId);\n return { decision: entry.decision, status: \"decided\" };\n }\n return { status: \"pending\" };\n}\nfunction setDecision(requestId, decision) {\n return pendingRequestsStore.setDecision(requestId, decision);\n}\nexport {\n cleanup as a,\n createPendingRequest as c,\n getDecision as g,\n setDecision as s\n};\n"],"names":[],"mappings":"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"}