@rubytech/create-maxy-code 0.1.35 → 0.1.37

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 (125) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/plugins/admin/PLUGIN.md +12 -0
  3. package/payload/platform/plugins/admin/hooks/__tests__/turn-completed-graph-write.test.sh +109 -0
  4. package/payload/platform/plugins/admin/hooks/turn-completed-graph-write.sh +114 -0
  5. package/payload/platform/plugins/admin/skills/unzip-attachment/SKILL.md +1 -1
  6. package/payload/platform/plugins/contacts/PLUGIN.md +11 -0
  7. package/payload/platform/plugins/docs/references/internals.md +10 -0
  8. package/payload/platform/plugins/docs/references/platform.md +11 -4
  9. package/payload/platform/plugins/email/PLUGIN.md +11 -0
  10. package/payload/platform/plugins/linkedin-import/.claude-plugin/plugin.json +1 -1
  11. package/payload/platform/plugins/linkedin-import/PLUGIN.md +5 -5
  12. package/payload/platform/plugins/linkedin-import/skills/linkedin-import/SKILL.md +3 -1
  13. package/payload/platform/plugins/linkedin-import/skills/linkedin-import/references/connections.md +2 -2
  14. package/payload/platform/plugins/memory/PLUGIN.md +11 -0
  15. package/payload/platform/plugins/memory/skills/conversation-archive/SKILL.md +2 -0
  16. package/payload/platform/plugins/memory/skills/conversation-archive-enrich/SKILL.md +2 -0
  17. package/payload/platform/plugins/memory/skills/document-ingest/SKILL.md +6 -4
  18. package/payload/platform/plugins/outlook/PLUGIN.md +11 -0
  19. package/payload/platform/plugins/replicate/PLUGIN.md +11 -0
  20. package/payload/platform/plugins/scheduling/PLUGIN.md +11 -0
  21. package/payload/platform/plugins/tasks/PLUGIN.md +11 -0
  22. package/payload/platform/plugins/telegram/PLUGIN.md +11 -0
  23. package/payload/platform/plugins/waitlist/PLUGIN.md +11 -0
  24. package/payload/platform/plugins/whatsapp/PLUGIN.md +11 -0
  25. package/payload/platform/plugins/workflows/PLUGIN.md +11 -0
  26. package/payload/platform/scripts/seed-neo4j.sh +14 -0
  27. package/payload/platform/scripts/verify-skill-tool-surface.sh +5 -3
  28. package/payload/platform/services/claude-session-manager/dist/config.d.ts +0 -5
  29. package/payload/platform/services/claude-session-manager/dist/config.d.ts.map +1 -1
  30. package/payload/platform/services/claude-session-manager/dist/config.js +16 -6
  31. package/payload/platform/services/claude-session-manager/dist/config.js.map +1 -1
  32. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +0 -5
  33. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  34. package/payload/platform/services/claude-session-manager/dist/http-server.js +109 -139
  35. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  36. package/payload/platform/services/claude-session-manager/dist/index.js +63 -4
  37. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  38. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +47 -61
  39. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  40. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +191 -131
  41. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  42. package/payload/platform/services/claude-session-manager/dist/session-store.d.ts +43 -37
  43. package/payload/platform/services/claude-session-manager/dist/session-store.d.ts.map +1 -1
  44. package/payload/platform/services/claude-session-manager/dist/session-store.js +72 -61
  45. package/payload/platform/services/claude-session-manager/dist/session-store.js.map +1 -1
  46. package/payload/platform/services/claude-session-manager/dist/tool-surface.d.ts +34 -4
  47. package/payload/platform/services/claude-session-manager/dist/tool-surface.d.ts.map +1 -1
  48. package/payload/platform/services/claude-session-manager/dist/tool-surface.js +125 -27
  49. package/payload/platform/services/claude-session-manager/dist/tool-surface.js.map +1 -1
  50. package/payload/platform/templates/agents/admin/IDENTITY.md +9 -18
  51. package/payload/platform/templates/specialists/agents/database-operator.md +27 -70
  52. package/payload/platform/templates/specialists/agents/librarian.md +55 -0
  53. package/payload/server/public/assets/{Checkbox-8mOR8-gV.js → Checkbox-DAki3vDW.js} +1 -1
  54. package/payload/server/public/assets/{admin-CK4V-B9A.js → admin-CyAZtsYZ.js} +1 -1
  55. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-2DgPtOot.js → architectureDiagram-Q4EWVU46-C-hla3Ip.js} +1 -1
  56. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-BilycXVZ.js → blockDiagram-DXYQGD6D-CbzjtNs3.js} +1 -1
  57. package/payload/server/public/assets/{brand-1_DraUIv.css → brand-Cun0PBrA.css} +1 -1
  58. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-CGiIFO5U.js → c4Diagram-AHTNJAMY-B87UblA0.js} +1 -1
  59. package/payload/server/public/assets/channel-CTNo72W7.js +1 -0
  60. package/payload/server/public/assets/{chunk-336JU56O-DxTg1h50.js → chunk-336JU56O-2a2pVlSg.js} +2 -2
  61. package/payload/server/public/assets/{chunk-426QAEUC-DkGPjs0P.js → chunk-426QAEUC-j9NOD8_a.js} +1 -1
  62. package/payload/server/public/assets/{chunk-4TB4RGXK-D2JaxD6r.js → chunk-4TB4RGXK-Cs872xAq.js} +1 -1
  63. package/payload/server/public/assets/{chunk-5FUZZQ4R-Do3pbAGo.js → chunk-5FUZZQ4R-BnDFbZ_I.js} +1 -1
  64. package/payload/server/public/assets/{chunk-5PVQY5BW-np5moZSl.js → chunk-5PVQY5BW-Bu5B3Hyf.js} +1 -1
  65. package/payload/server/public/assets/{chunk-EDXVE4YY-BUFLWwRP.js → chunk-EDXVE4YY-B96Fw4FF.js} +1 -1
  66. package/payload/server/public/assets/{chunk-ENJZ2VHE-BE7Gt41s.js → chunk-ENJZ2VHE-CcGrGQim.js} +1 -1
  67. package/payload/server/public/assets/{chunk-ICPOFSXX-gOBkROMP.js → chunk-ICPOFSXX-ZRvcI4Ai.js} +1 -1
  68. package/payload/server/public/assets/{chunk-OYMX7WX6-DR-BkNZa.js → chunk-OYMX7WX6-B6RI9Fbf.js} +1 -1
  69. package/payload/server/public/assets/{chunk-U2HBQHQK-qLp-uSVE.js → chunk-U2HBQHQK-BYGHVYyo.js} +1 -1
  70. package/payload/server/public/assets/{chunk-X2U36JSP-DQiKti0J.js → chunk-X2U36JSP-rwNs-gTO.js} +1 -1
  71. package/payload/server/public/assets/{chunk-YZCP3GAM-Cd0JhpTo.js → chunk-YZCP3GAM-jPttJRap.js} +1 -1
  72. package/payload/server/public/assets/{chunk-ZZ45TVLE-8u01H3Hy.js → chunk-ZZ45TVLE-DLykWOT5.js} +1 -1
  73. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BaV5nDmT.js +1 -0
  74. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DOKlCKjY.js +1 -0
  75. package/payload/server/public/assets/clone-sQSwlSln.js +1 -0
  76. package/payload/server/public/assets/{dagre-KV5264BT-BBF_zxbi.js → dagre-KV5264BT-C6wSzHX2.js} +1 -1
  77. package/payload/server/public/assets/{dagre-BfVsOYOv.js → dagre-jnQDnF-5.js} +1 -1
  78. package/payload/server/public/assets/data-DbkuXcPb.js +1 -0
  79. package/payload/server/public/assets/{device-url-actions-CJBD3ecO.js → device-url-actions-y1tXNDZx.js} +1 -1
  80. package/payload/server/public/assets/{diagram-5BDNPKRD-BFHk2a7t.js → diagram-5BDNPKRD-N3X-n90h.js} +1 -1
  81. package/payload/server/public/assets/{diagram-G4DWMVQ6-Be3_qYl2.js → diagram-G4DWMVQ6-vfmbzdPd.js} +1 -1
  82. package/payload/server/public/assets/{diagram-MMDJMWI5-B3r4XVcu.js → diagram-MMDJMWI5-BETmPx_w.js} +1 -1
  83. package/payload/server/public/assets/{diagram-TYMM5635-BW5EIT4D.js → diagram-TYMM5635-BSUGM4wG.js} +1 -1
  84. package/payload/server/public/assets/{erDiagram-SMLLAGMA-DTu4_1Kb.js → erDiagram-SMLLAGMA-CWZ9OwMb.js} +1 -1
  85. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-CadrjLcA.js → flowDiagram-DWJPFMVM-BpQOQS1a.js} +1 -1
  86. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-Cn0npD0L.js → ganttDiagram-T4ZO3ILL-Dc59igCS.js} +1 -1
  87. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-CK3gG5Qm.js → gitGraphDiagram-UUTBAWPF-D6lXg3zl.js} +1 -1
  88. package/payload/server/public/assets/graph-CC5_6-dg.js +1 -0
  89. package/payload/server/public/assets/{graph-labels-CPzF6Gbk.js → graph-labels-DFyNH0jb.js} +1 -1
  90. package/payload/server/public/assets/{graphlib-DFIOO59N.js → graphlib-yG7kH8Fr.js} +1 -1
  91. package/payload/server/public/assets/{infoDiagram-42DDH7IO-BohUsXnN.js → infoDiagram-42DDH7IO-TS9Pv8Os.js} +1 -1
  92. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-tjmA4BU8.js → ishikawaDiagram-UXIWVN3A-BJiJJTq6.js} +1 -1
  93. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-DzBlFESM.js → journeyDiagram-VCZTEJTY-C7PW4fmw.js} +1 -1
  94. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-BTw9BxK8.js → kanban-definition-6JOO6SKY-BEk21ciD.js} +1 -1
  95. package/payload/server/public/assets/{line-BYPL6wAj.js → line-DusyVWDE.js} +1 -1
  96. package/payload/server/public/assets/{mermaid-parser.core-Dmu4fWCS.js → mermaid-parser.core-DeeojQSb.js} +1 -1
  97. package/payload/server/public/assets/{mermaid.core-Z9vvieC2.js → mermaid.core-p65Lo7Sj.js} +3 -3
  98. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-BccAnfJ4.js → mindmap-definition-QFDTVHPH-B0jxFxdS.js} +1 -1
  99. package/payload/server/public/assets/{page-CBTlFm3b.js → page-BeYGnDzI.js} +1 -1
  100. package/payload/server/public/assets/{page-CDrsNrDO.js → page-x5khmfRx.js} +1 -1
  101. package/payload/server/public/assets/{pieDiagram-DEJITSTG-CZwxH1nJ.js → pieDiagram-DEJITSTG-DJ5GKYt6.js} +1 -1
  102. package/payload/server/public/assets/{public-MKWxjwiF.js → public-cnoUs7vq.js} +3 -3
  103. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-BWT4DItX.js → quadrantDiagram-34T5L4WZ-BV7R-kwV.js} +1 -1
  104. package/payload/server/public/assets/{requirementDiagram-MS252O5E-CHYkWUEy.js → requirementDiagram-MS252O5E-DRiLzlGN.js} +1 -1
  105. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-km7p45Ng.js → sankeyDiagram-XADWPNL6-C5-6_cCI.js} +1 -1
  106. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-BT1C0Dw-.js → sequenceDiagram-FGHM5R23-5FXm_VYM.js} +1 -1
  107. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-hibC19DY.js → stateDiagram-FHFEXIEX-FCQTaGqV.js} +1 -1
  108. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BdpPhdqg.js +1 -0
  109. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-Cnm86NfE.js → timeline-definition-GMOUNBTQ-tvtq62ef.js} +1 -1
  110. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-ByjQPLzS.js → vennDiagram-DHZGUBPP-Dk-k7CE4.js} +1 -1
  111. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-CMVrWw7l.js → wardleyDiagram-NUSXRM2D-CZSrqniY.js} +1 -1
  112. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-Mpc1u3FV.js → xychartDiagram-5P7HB3ND-CpGLpk7Q.js} +1 -1
  113. package/payload/server/public/data.html +5 -5
  114. package/payload/server/public/graph.html +6 -6
  115. package/payload/server/public/index.html +8 -8
  116. package/payload/server/public/public.html +5 -5
  117. package/payload/server/server.js +128 -106
  118. package/payload/server/public/assets/channel-DYpIZW3Q.js +0 -1
  119. package/payload/server/public/assets/classDiagram-6PBFFD2Q-nkfy9gg7.js +0 -1
  120. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-B-pMmeCC.js +0 -1
  121. package/payload/server/public/assets/clone-jiTzIER6.js +0 -1
  122. package/payload/server/public/assets/data-BIOaDoqe.js +0 -1
  123. package/payload/server/public/assets/graph-ClfU7t1k.js +0 -1
  124. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-MuJZxjmU.js +0 -1
  125. /package/payload/server/public/assets/{brand-CENN2zdq.js → brand-lj7EhWRg.js} +0 -0
@@ -1,26 +1,24 @@
1
1
  // Spawn a `claude --verbose` PTY child, capture the /remote-control URL,
2
- // wait for Claude Code's intrinsic JSONL to appear on disk, and register
3
- // the session keyed on the intrinsic `claudeSessionId` (the JSONL
4
- // basename). The PTY stream flows without persisting — Claude's JSONL
5
- // transcript at ~/.claude/projects/<project>/<id>.jsonl is the canonical
6
- // forensic record.
2
+ // register the session keyed on the URL's bridge suffix, and return 200
3
+ // immediately. The PTY stream flows; Claude Code writes its intrinsic JSONL
4
+ // to ~/.<brand>/.claude/projects/<slug>/<intrinsic>.jsonl on the first
5
+ // operator turn which may be seconds, minutes, or never. The jsonl-observer
6
+ // fires when that file appears and promotes the row to the intrinsic
7
+ // claudeSessionId without changing its surface identity.
7
8
  //
8
- // the manager mints zero session ids of its own. The intrinsic
9
- // claude session id (the JSONL basename Claude Code writes on disk) is
10
- // the one identifier per Claude process for its entire lifetime, observed
11
- // from disk, never derived from any other signal. Spawn responses
12
- // block on observation (default 5 s timeout); on timeout the spawn
13
- // returns 504 and the PTY is killed. The bridge-binding race is closed
14
- // inside this file: the PTY is registered in `store.addPending` while
15
- // the URL is captured; the entry promotes into the main store on
16
- // observation, or is removed on timeout or PTY exit before observe.
9
+ // The manager mints zero session ids of its own. The bridge suffix is the
10
+ // row's identifier from URL capture; the intrinsic id takes over for
11
+ // JSONL-bound routes once observation fires. /spawn no longer blocks on
12
+ // observation, so the `observe-timeout` failure mode (Task 065's loud-fail
13
+ // timer) is gone an operator who clicks `+ New session` and then walks
14
+ // away does not get a killed PTY.
17
15
  //
18
- // On failure (spawn ENOENT, generic spawn error, url-capture-timeout,
19
- // bridge-suffix-unparseable, observe-timeout, pty-exited-before-observe)
20
- // the child is killed (if alive) before the error surfaces to the caller.
21
- // The `[claude-session-manager] spawn-failed reason=<…>` log line names
22
- // the reason.
23
- import { mkdirSync } from 'node:fs';
16
+ // Remaining spawn failure surfaces (all return 500 with `stderrTail`):
17
+ // which-claude-not-found, pty-spawn-failed, url-capture-timeout,
18
+ // bridge-suffix-unparseable, host-context-unresolved, identity-unresolved.
19
+ import { mkdirSync, writeFileSync, existsSync } from 'node:fs';
20
+ import { tmpdir } from 'node:os';
21
+ import { join } from 'node:path';
24
22
  import { startUrlCapture } from './url-capture.js';
25
23
  import { bridgeSuffixFromUrl } from './jsonl-path.js';
26
24
  // CSI (Cursor / Style) escape sequence: ESC `[` <args> <final-letter>.
@@ -35,10 +33,6 @@ const PTY_TAIL_BYTES = 4 * 1024;
35
33
  // line never balloons past ~2 KiB. The full tail still goes onto the wire
36
34
  // (SpawnResult.stderrTail) so the UI can surface it.
37
35
  const PTY_TAIL_LOG_BYTES = 1024;
38
- /** Attach a bounded ring buffer to the PTY's stdout so every spawn-failure
39
- * exit path has the raw text claude printed instead of an empty stderr-tail.
40
- * Returns a `getTail()` accessor and an idempotent `dispose()` that
41
- * detaches the data listener (the captured bytes remain readable). */
42
36
  function attachPtyTail(pty) {
43
37
  let buf = '';
44
38
  let sub = pty.onData((data) => {
@@ -56,27 +50,95 @@ function attachPtyTail(pty) {
56
50
  },
57
51
  };
58
52
  }
59
- /** Shape the rolling buffer into the field rendered in failure log lines:
60
- * cap at `PTY_TAIL_LOG_BYTES`, JSON-escape control chars, surround in quotes. */
61
53
  function formatTailForLog(tail) {
62
54
  const trimmed = tail.length > PTY_TAIL_LOG_BYTES ? tail.slice(-PTY_TAIL_LOG_BYTES) : tail;
63
55
  return JSON.stringify(trimmed);
64
56
  }
65
57
  import { composeAppendSystemPrompt, } from './system-prompt.js';
66
58
  export const PERMISSION_MODES = ['default', 'acceptEdits', 'plan', 'auto'];
59
+ /** Expand `${VAR}` placeholders that appear in PLUGIN.md mcp args/env. Only
60
+ * PLATFORM_ROOT, ACCOUNT_ID, SESSION_ID, LOG_DIR are substituted — everything
61
+ * else is passed through literally so Claude Code's own var-expansion (if
62
+ * any) still applies. */
63
+ function expandPlaceholders(raw, vars) {
64
+ return raw.replace(/\$\{([A-Z_][A-Z0-9_]*)\}/g, (m, name) => {
65
+ return Object.prototype.hasOwnProperty.call(vars, name) ? vars[name] : m;
66
+ });
67
+ }
68
+ function writePerSpawnMcpConfig(p) {
69
+ // Public spawns currently expose zero MCP tools (no plugin sets
70
+ // publicAllowlist: true). Write a config with an empty `mcpServers` map so
71
+ // the --mcp-config flag still appears in argv — keeps the argv shape
72
+ // identical across roles and makes the observability emit unambiguous.
73
+ const serversForRole = [];
74
+ if (p.role === 'admin') {
75
+ // Admin sees every plugin's MCP server.
76
+ for (const [name, desc] of p.toolSurface.mcpServers)
77
+ serversForRole.push([name, desc]);
78
+ }
79
+ else {
80
+ // Public sees only plugins that contribute at least one public tool.
81
+ const publicPluginNames = new Set();
82
+ for (const t of p.toolSurface.public) {
83
+ // Qualified tools look like `mcp__<plugin>__<tool>`. Plugin and tool
84
+ // names use single hyphens/underscores; the delimiter is the literal
85
+ // `__` pair, so a non-greedy match terminates at the first one.
86
+ const m = t.match(/^mcp__(.+?)__/);
87
+ if (m)
88
+ publicPluginNames.add(m[1]);
89
+ }
90
+ for (const [name, desc] of p.toolSurface.mcpServers) {
91
+ if (publicPluginNames.has(name))
92
+ serversForRole.push([name, desc]);
93
+ }
94
+ }
95
+ const placeholders = {
96
+ PLATFORM_ROOT: p.platformRoot,
97
+ ACCOUNT_ID: p.accountId,
98
+ SESSION_ID: p.bridgeSuffixHint,
99
+ LOG_DIR: p.logDir,
100
+ };
101
+ const mcpServers = {};
102
+ for (const [name, desc] of serversForRole) {
103
+ const entry = {
104
+ command: expandPlaceholders(desc.command, placeholders),
105
+ args: desc.args.map((a) => expandPlaceholders(a, placeholders)),
106
+ };
107
+ if (desc.env) {
108
+ const env = {};
109
+ for (const [k, v] of Object.entries(desc.env))
110
+ env[k] = expandPlaceholders(v, placeholders);
111
+ entry.env = env;
112
+ }
113
+ mcpServers[name] = entry;
114
+ }
115
+ const payload = JSON.stringify({ mcpServers }, null, 2);
116
+ const fileName = `maxy-mcp-${p.bridgeSuffixHint.replace(/[^A-Za-z0-9_-]/g, '_')}.json`;
117
+ const target = join(p.targetDir, fileName);
118
+ try {
119
+ mkdirSync(p.targetDir, { recursive: true });
120
+ writeFileSync(target, payload, 'utf8');
121
+ }
122
+ catch (err) {
123
+ const msg = err instanceof Error ? err.message : String(err);
124
+ p.logger(`mcp-config-write-failed target=${target} err=${JSON.stringify(msg)}`);
125
+ return { ok: false, detail: msg };
126
+ }
127
+ return { ok: true, path: target, bytes: Buffer.byteLength(payload, 'utf8'), serverCount: serversForRole.length };
128
+ }
67
129
  export async function spawnClaudeSession(deps, args) {
68
130
  const startedAt = new Date().toISOString();
69
131
  const start = Date.now();
70
- const composed = composeAppendSystemPrompt(deps.host, { accountDir: deps.accountDir, role: args.role }, { aboutOwner: args.aboutOwner, dormantPlugins: args.dormantPlugins });
132
+ const composedHost = deps.tunnelUrlOverride !== undefined
133
+ ? { ...deps.host, tunnelUrl: deps.tunnelUrlOverride }
134
+ : deps.host;
135
+ const composed = composeAppendSystemPrompt(composedHost, { accountDir: deps.accountDir, role: args.role }, { aboutOwner: args.aboutOwner, dormantPlugins: args.dormantPlugins });
71
136
  if (!composed.ok) {
72
137
  if (composed.reason === 'host-unresolved') {
73
138
  const stderrTail = deps.host.lanIPv4Diagnostic ?? 'append-system-prompt unresolved';
74
139
  deps.logger(`spawn-failed reason=host-context-unresolved stderr-tail=${JSON.stringify(stderrTail)}`);
75
140
  return { ok: false, reason: 'host-context-unresolved', stderrTail };
76
141
  }
77
- // Split the `<path>:<code>` detail into separate file= and err= fields
78
- // so an operator can grep either independently. stderrTail keeps the
79
- // joined form per task contract.
80
142
  const sep = composed.detail.lastIndexOf(':');
81
143
  const file = sep > 0 ? composed.detail.slice(0, sep) : composed.detail;
82
144
  const err = sep > 0 ? composed.detail.slice(sep + 1) : '';
@@ -84,11 +146,6 @@ export async function spawnClaudeSession(deps, args) {
84
146
  return { ok: false, reason: 'identity-unresolved', stderrTail: composed.detail };
85
147
  }
86
148
  const appendSystemPrompt = composed.block;
87
- // log the compose result on the success path too — without this line
88
- // the operator only sees the [pty-spawn] log AFTER observation success,
89
- // so spawn-failed sessions had no recorded byte-count breakdown of the
90
- // system prompt that was actually injected. Same fields as the existing
91
- // [pty-spawn] log line so an operator can grep either entry point.
92
149
  deps.logger(`compose-system-prompt-ok role=${args.role} accountDir=${deps.accountDir} appendSystemPromptBytes=${Buffer.byteLength(appendSystemPrompt, 'utf8')} identityBytes=${composed.identityBytes} soulBytes=${composed.soulBytes} aboutOwnerBytes=${composed.aboutOwnerBytes} dormantPluginsBytes=${composed.dormantPluginsBytes}`);
93
150
  const argv = [
94
151
  '--verbose',
@@ -99,23 +156,19 @@ export async function spawnClaudeSession(deps, args) {
99
156
  if (args.resumeClaudeSessionId) {
100
157
  argv.push('--resume', args.resumeClaudeSessionId);
101
158
  }
159
+ if (args.specialist) {
160
+ argv.push('--agent', args.specialist);
161
+ }
102
162
  if (args.channels && args.channels.length > 0) {
103
163
  for (const ch of args.channels) {
104
164
  argv.push('--channels', ch);
105
165
  }
106
166
  }
107
- // per-role tool-allowlist argv. The set is precomputed at boot
108
- // and never inferred per call; this loop just renders it. Sorted output
109
- // gives byte-stable argv for snapshot tests and grep-friendly log lines.
110
167
  const allowedSet = args.role === 'public' ? deps.toolSurface.public : deps.toolSurface.admin;
111
168
  const allowed = Array.from(allowedSet).sort();
112
169
  for (const tool of allowed) {
113
170
  argv.push('--allowed-tools', tool);
114
171
  }
115
- // Observability — sample up to 5 excluded tool names so an operator
116
- // grepping the spawn log can see at a glance what a public role cannot
117
- // touch. Admin role excludes nothing; the field is still emitted (empty)
118
- // so the line shape is uniform across roles.
119
172
  const excludedSample = args.role === 'public'
120
173
  ? Array.from(deps.toolSurface.admin).filter((t) => !deps.toolSurface.public.has(t)).sort().slice(0, 5).join(',')
121
174
  : '';
@@ -123,22 +176,42 @@ export async function spawnClaudeSession(deps, args) {
123
176
  if (args.permissionMode && args.permissionMode !== 'default') {
124
177
  argv.push('--permission-mode', args.permissionMode);
125
178
  }
126
- // public-chat attachment passthrough. Pre-create the per-session
127
- // upload dir (so --add-dir does not fail on a missing path), then grant
128
- // claude scoped Read access to it. The Read allow-rule mirrors the dir, so
129
- // a `Read("/etc/passwd")` call from the PTY is refused by claude's
130
- // permissions layer regardless of any operator instruction in the turn.
179
+ // Per-spawn mcp-config.json: role-gated descriptor union resolved from the
180
+ // tool-surface. Plugins that contribute zero public tools (every plugin
181
+ // today) are admin-only public spawns get no MCP servers, which matches
182
+ // their empty allow-list.
183
+ const mcpConfigResult = writePerSpawnMcpConfig({
184
+ role: args.role,
185
+ toolSurface: deps.toolSurface,
186
+ accountId: deps.accountId,
187
+ platformRoot: deps.platformRoot,
188
+ logDir: deps.logDir,
189
+ bridgeSuffixHint: args.senderId,
190
+ targetDir: deps.mcpConfigDir ?? tmpdir(),
191
+ logger: deps.logger,
192
+ });
193
+ if (!mcpConfigResult.ok) {
194
+ return { ok: false, reason: 'mcp-config-write-failed', stderrTail: mcpConfigResult.detail };
195
+ }
196
+ argv.push('--mcp-config', mcpConfigResult.path);
197
+ // Bundled plugin agents (`platform/plugins/*/agents/`,
198
+ // `premium-plugins/*/agents/`) — both roles. Per-account specialists
199
+ // (`<accountDir>/specialists/agents/`) — admin only. `--add-dir` lets
200
+ // Claude Code's `subagent_type` dispatch reach the file on disk.
201
+ const dirsToAdd = [...deps.agentsDirs[args.role]];
202
+ if (args.role === 'admin' && existsSync(deps.perAccountSpecialistsDir)) {
203
+ dirsToAdd.push(deps.perAccountSpecialistsDir);
204
+ }
205
+ for (const d of dirsToAdd) {
206
+ argv.push('--add-dir', d);
207
+ deps.logger(`pty-spawn-agents-dir role=${args.role} path=${d}`);
208
+ }
209
+ deps.logger(`pty-spawn-mcp-config servers=${mcpConfigResult.serverCount} tools=${allowed.length} bytes=${mcpConfigResult.bytes} path=${mcpConfigResult.path}`);
131
210
  if (args.role === 'public' && args.attachmentDir) {
132
211
  mkdirSync(args.attachmentDir, { recursive: true });
133
212
  argv.push('--add-dir', args.attachmentDir);
134
213
  argv.push('--allowed-tools', `Read(${args.attachmentDir}/**)`);
135
214
  }
136
- // log every PTY spawn invocation with the argv shape so an
137
- // operator who sees a `spawn-failed reason=pty-spawn-failed` or a
138
- // missing url-capture line can verify which binary was invoked, how
139
- // many flags it received, and how big the --append-system-prompt
140
- // value was. The argv array itself is too large to log (the 150 +
141
- // --allowed-tools entries balloon the line); shape-only is enough.
142
215
  deps.logger(`pty-spawn-start claudeBin=${deps.claudeBin} argv-count=${argv.length} append-system-prompt-bytes=${Buffer.byteLength(appendSystemPrompt, 'utf8')} permission-mode=${args.permissionMode ?? 'default'} resume=${args.resumeClaudeSessionId ? 'yes' : 'no'}`);
143
216
  const ptySpawnStart = Date.now();
144
217
  let pty;
@@ -146,6 +219,11 @@ export async function spawnClaudeSession(deps, args) {
146
219
  pty = deps.spawnPty(deps.claudeBin, argv, {
147
220
  ...process.env,
148
221
  TERM: 'xterm-256color',
222
+ // Stop-hook gate reads these — admin foreground sessions fire the
223
+ // per-turn graph-write hook; everything else (public role, hidden
224
+ // background recorder PTYs) exits the hook 0 early.
225
+ MAXY_SESSION_ROLE: args.role,
226
+ MAXY_HIDDEN_SPAWN: args.hidden ? '1' : '0',
149
227
  });
150
228
  }
151
229
  catch (err) {
@@ -156,123 +234,105 @@ export async function spawnClaudeSession(deps, args) {
156
234
  return { ok: false, reason, stderrTail };
157
235
  }
158
236
  deps.logger(`pty-spawned pid=${pty.pid} ms=${Date.now() - ptySpawnStart}`);
159
- // PTY stdout ring buffer: attach BEFORE url-capture so the tail covers
160
- // the welcome banner and any bytes claude prints before the URL line.
161
- // Survives the url-capture data-listener disposal because the tail's
162
- // listener is a separate subscription. Detached on PTY exit.
163
237
  const tail = attachPtyTail(pty);
164
238
  return await new Promise((resolve) => {
239
+ let settled = false;
240
+ const settle = (outcome) => {
241
+ if (settled)
242
+ return;
243
+ settled = true;
244
+ resolve(outcome);
245
+ };
165
246
  startUrlCapture({
166
247
  pty,
167
248
  timeoutMs: deps.urlCaptureTimeoutMs,
168
249
  logger: deps.logger,
169
250
  onUrl: (url) => {
170
251
  const bridgeSuffix = bridgeSuffixFromUrl(url);
171
- // log the parsed bridge suffix on the success path so an operator
172
- // can see the exact substring the observer will look for in the
173
- // JSONL head bytes; the failing 16:26 spawn on the Pi had no such
174
- // line until a manager restart erased the trail.
175
252
  deps.logger(`bridge-suffix-extracted suffix=${bridgeSuffix ?? 'null'} url=${url}`);
176
253
  if (!bridgeSuffix) {
177
- // Without a bridge suffix the observer cannot bind, the session
178
- // cannot be promoted, and the PTY would hang as an orphan.
179
- // Loud-fail.
180
254
  pty.kill('SIGKILL');
181
255
  const stderrTail = tail.getTail();
182
256
  deps.logger(`spawn-failed reason=bridge-suffix-unparseable url=${url} stderr-tail=${formatTailForLog(stderrTail)}`);
183
- resolve({ ok: false, reason: 'bridge-suffix-unparseable', stderrTail });
257
+ settle({ ok: false, reason: 'bridge-suffix-unparseable', stderrTail });
184
258
  return;
185
259
  }
186
- const pending = {
260
+ const session = {
187
261
  bridgeSuffix,
262
+ claudeSessionId: null,
188
263
  pid: pty.pid,
189
264
  url,
190
265
  startedAt,
191
266
  senderId: args.senderId,
192
267
  role: args.role,
193
268
  channel: args.channel,
269
+ jsonlPath: null,
194
270
  pty,
195
271
  exited: false,
272
+ hidden: args.hidden === true,
273
+ specialist: args.specialist ?? null,
196
274
  };
197
- deps.store.addPending(pending);
198
- const observation = deps.observer.observe({ bridgeSuffix });
199
- let timer = null;
200
- let settled = false;
201
- const settle = (outcome) => {
202
- if (settled)
203
- return;
204
- settled = true;
205
- if (timer)
206
- clearTimeout(timer);
207
- resolve(outcome);
208
- };
209
- // PTY exit in the gap between URL capture and observation: drop
210
- // the pending entry, cancel the observation, surface a hard
211
- // error to the caller (no orphan). The kill log carries the real
212
- // exit-code and signal from the PTY layer (it used to be a
213
- // hardcoded `exit-code=0` which masked SIGKILL-from-our-own-timer
214
- // as a clean exit).
215
- pty.onExit((e) => {
216
- pending.exited = true;
217
- const stderrTail = tail.getTail();
218
- tail.dispose();
219
- if (!settled) {
220
- deps.store.removePending(bridgeSuffix);
221
- observation.cancel();
222
- deps.logger(`spawn-failed reason=pty-exited-before-observe bridgeSuffix=${bridgeSuffix} exit-code=${e.exitCode} signal=${e.signal ?? 'none'} stderr-tail=${formatTailForLog(stderrTail)}`);
223
- settle({ ok: false, reason: 'pty-exited-before-observe', stderrTail });
275
+ deps.store.addPending(session);
276
+ if (args.hidden === true) {
277
+ deps.logger(`hidden-spawn specialist=${args.specialist ?? 'none'} bridgeSuffix=${bridgeSuffix} pid=${pty.pid}`);
278
+ }
279
+ if (args.stdinPayload !== undefined) {
280
+ try {
281
+ pty.write(args.stdinPayload + '\r');
224
282
  }
225
- deps.logger(`kill pid=${pty.pid} reason=process-exited exit-code=${e.exitCode} signal=${e.signal ?? 'none'} stderr-tail=${formatTailForLog(stderrTail)}`);
226
- });
227
- // observe-loud-fail timer. Default 5 s; tests use
228
- // shorter values via `observeTimeoutMs`.
229
- timer = setTimeout(() => {
230
- if (settled)
231
- return;
232
- deps.store.removePending(bridgeSuffix);
233
- observation.cancel();
234
- pty.kill('SIGKILL');
235
- const stderrTail = tail.getTail();
236
- deps.logger(`spawn-await-observe-timeout bridgeSuffix=${bridgeSuffix} timeoutMs=${deps.observeTimeoutMs} stderr-tail=${formatTailForLog(stderrTail)}`);
237
- settle({ ok: false, reason: 'observe-timeout', stderrTail });
238
- }, deps.observeTimeoutMs);
283
+ catch (err) {
284
+ const msg = err instanceof Error ? err.message : String(err);
285
+ deps.logger(`hidden-stdin-write-failed bridgeSuffix=${bridgeSuffix} message=${msg}`);
286
+ }
287
+ }
288
+ // Spawn-response side: respond on URL capture, no observer wait.
289
+ // The observation runs in the background and promotes the row when
290
+ // the first operator turn lands. `wait-ms` on `jsonl-observed` is
291
+ // unbounded by design — high values are the normal idle-then-typed
292
+ // case, not a fault.
293
+ const observation = deps.observer.observe({ bridgeSuffix });
239
294
  observation.promise.then((observed) => {
240
- if (settled)
241
- return;
242
295
  if (!observed) {
243
- // Observer returned null (cancelled). The spawn waits for the
244
- // timer or pty-exit to settle; no action needed here.
296
+ // Observer cancelled (e.g. operator deleted the row before
297
+ // typing). Nothing to do pending row is already gone.
245
298
  return;
246
299
  }
247
- const session = deps.store.promotePending(bridgeSuffix, observed.claudeSessionId, observed.jsonlPath);
248
- if (!session) {
249
- // Pending was removed by pty-exit or timer just before this
250
- // microtask landed. Whichever branch fired has already settled.
300
+ const promoted = deps.store.promote(bridgeSuffix, observed.claudeSessionId, observed.jsonlPath);
301
+ if (!promoted) {
302
+ // Row was removed before promotion landed; drop the observation.
251
303
  return;
252
304
  }
253
- // After promotion, attach the session's exit hook to the main-
254
- // store entry so subsequent pty exits flip its `exited` flag and
255
- // detach the audit watcher via the http-server onExit path.
256
- pty.onExit(() => {
257
- session.exited = true;
258
- });
259
305
  const waitMs = Date.now() - start;
260
- deps.logger(`jsonl-observed pid=${pty.pid} sessionId=${observed.claudeSessionId} path=${observed.jsonlPath}`);
261
- deps.logger(`spawn pid=${pty.pid} sessionUrl=${url} senderId=${args.senderId} role=${args.role} channel=${args.channel} permissionMode=${args.permissionMode ?? 'default'} latency-ms=${waitMs}`);
262
- // single `[pty-spawn]` line that names
263
- // the intrinsic session id along with the per-spawn
264
- // identity/soul/account/role fields.
265
- deps.logger(`[pty-spawn] sessionId=${observed.claudeSessionId} appendSystemPromptBytes=${Buffer.byteLength(appendSystemPrompt, 'utf8')} identityBytes=${composed.identityBytes} soulBytes=${composed.soulBytes} aboutOwnerBytes=${composed.aboutOwnerBytes} dormantPluginsBytes=${composed.dormantPluginsBytes} accountDir=${deps.accountDir} role=${args.role} hostname=${deps.host.hostname} lanIPv4=${deps.host.lanIPv4} adminUrl=${deps.host.adminUrl} tunnelUrl=${deps.host.tunnelUrl ?? 'none'}`);
266
- deps.logger(`spawn-await-observe bridgeSuffix=${bridgeSuffix} ms=${waitMs}`);
267
- deps.onJsonlObserved?.(session);
268
- settle({ ok: true, session });
306
+ deps.logger(`jsonl-observed pid=${pty.pid} sessionId=${observed.claudeSessionId} bridgeSuffix=${bridgeSuffix} path=${observed.jsonlPath} wait-ms=${waitMs}`);
307
+ deps.logger(`session-id-promoted bridgeSuffix=${bridgeSuffix} intrinsic=${observed.claudeSessionId} pid=${pty.pid}`);
308
+ deps.logger(`[pty-spawn] sessionId=${observed.claudeSessionId} appendSystemPromptBytes=${Buffer.byteLength(appendSystemPrompt, 'utf8')} identityBytes=${composed.identityBytes} soulBytes=${composed.soulBytes} aboutOwnerBytes=${composed.aboutOwnerBytes} dormantPluginsBytes=${composed.dormantPluginsBytes} accountDir=${deps.accountDir} role=${args.role} hostname=${deps.host.hostname} lanIPv4=${deps.host.lanIPv4} adminUrl=${deps.host.adminUrl} tunnelUrl=${composedHost.tunnelUrl ?? 'none'}`);
309
+ deps.onJsonlObserved?.(promoted);
310
+ });
311
+ // PTY exit: flip the exited flag and cancel the observation. No
312
+ // hard error here — by design the PTY may outlive any number of
313
+ // operator-idle periods; only after promotion is the JSONL useful.
314
+ pty.onExit((e) => {
315
+ session.exited = true;
316
+ const stderrTail = tail.getTail();
317
+ tail.dispose();
318
+ observation.cancel();
319
+ if (session.claudeSessionId === null) {
320
+ // never typed → drop the pending row silently
321
+ deps.store.remove(bridgeSuffix);
322
+ deps.logger(`session-closed-idle bridgeSuffix=${bridgeSuffix} pid=${pty.pid}`);
323
+ }
324
+ deps.logger(`kill pid=${pty.pid} reason=process-exited exit-code=${e.exitCode} signal=${e.signal ?? 'none'} stderr-tail=${formatTailForLog(stderrTail)}`);
269
325
  });
326
+ const responseMs = Date.now() - start;
327
+ deps.logger(`spawn-response-returned bridgeSuffix=${bridgeSuffix} pid=${pty.pid} ms=${responseMs}`);
328
+ deps.logger(`spawn pid=${pty.pid} sessionUrl=${url} senderId=${args.senderId} role=${args.role} channel=${args.channel} permissionMode=${args.permissionMode ?? 'default'} latency-ms=${responseMs}`);
329
+ settle({ ok: true, session });
270
330
  },
271
331
  onTimeout: () => {
272
332
  pty.kill('SIGKILL');
273
333
  const stderrTail = tail.getTail();
274
334
  deps.logger(`spawn-failed reason=url-capture-timeout stderr-tail=${formatTailForLog(stderrTail)}`);
275
- resolve({ ok: false, reason: 'url-capture-timeout', stderrTail });
335
+ settle({ ok: false, reason: 'url-capture-timeout', stderrTail });
276
336
  },
277
337
  });
278
338
  });
@@ -1 +1 @@
1
- {"version":3,"file":"pty-spawner.js","sourceRoot":"","sources":["../src/pty-spawner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pty-spawner.js","sourceRoot":"","sources":["../src/pty-spawner.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,15 @@
1
1
  import type { PtyHandle, Role, Channel } from './types.js';
2
2
  export interface StoredSession {
3
+ /** URL bridge suffix captured from the /remote-control URL. Stable for
4
+ * the row's entire alive lifetime — never null, never replaced. Surfaced
5
+ * as the row's `sessionId` on every wire response so the UI mounts its
6
+ * pane against this identifier from t=0 (URL capture). */
7
+ bridgeSuffix: string;
3
8
  /** Intrinsic claude session id — the JSONL basename Claude Code wrote.
4
- * Equals the value of `claudeSessionId` everywhere else in the manager.
5
- * Set at promotion time; never null on a session that exists in the
6
- * main store. */
7
- claudeSessionId: string;
9
+ * Null between URL capture and the first turn the operator types (claude
10
+ * defers JSONL write to the first turn). Filled when the jsonl-observer
11
+ * fires; thereafter equals the intrinsic id forever. */
12
+ claudeSessionId: string | null;
8
13
  pid: number;
9
14
  url: string;
10
15
  startedAt: string;
@@ -12,46 +17,47 @@ export interface StoredSession {
12
17
  role: Role;
13
18
  channel: Channel;
14
19
  /** Path of the JSONL Claude Code wrote, observed from disk by the
15
- * jsonl-observer. Non-null on a promoted session. */
16
- jsonlPath: string;
17
- pty: PtyHandle;
18
- exited: boolean;
19
- }
20
- /** Transient state held during the spawn-time bridge-binding race (Task
21
- * 069). The PTY is alive, the URL is captured, but Claude Code has not
22
- * yet written its first JSONL line. The entry is keyed by the URL bridge
23
- * suffix (the only stable id we have until observation fires). */
24
- export interface PendingSession {
25
- bridgeSuffix: string;
26
- pid: number;
27
- url: string;
28
- startedAt: string;
29
- senderId: string;
30
- role: Role;
31
- channel: Channel;
20
+ * jsonl-observer. Null until promotion fires (mirrors claudeSessionId). */
21
+ jsonlPath: string | null;
32
22
  pty: PtyHandle;
33
- /** True once the PTY has exited. Used by the spawner to short-circuit
34
- * the observation race when the process dies first. */
35
23
  exited: boolean;
24
+ /** Background spawns (per-turn database-operator recorder, future
25
+ * out-of-band specialists) set `hidden: true` at /spawn time. /list
26
+ * filters them out by default so they never appear in the sidebar,
27
+ * the operator URL, or the artefact pane; /list?includeHidden=1
28
+ * surfaces them for diagnostics. Defaults to false. */
29
+ hidden: boolean;
30
+ /** Specialist agent name passed as `--agent <name>` to claude when the
31
+ * spawn should land inside a specific specialist (database-operator,
32
+ * etc.). Null on user-facing spawns. */
33
+ specialist: string | null;
36
34
  }
37
35
  export declare class SessionStore {
38
- private readonly sessions;
39
- private readonly pendingByBridge;
40
- add(s: StoredSession): void;
36
+ /** Keyed by the row's stable surface id (bridge suffix). Lookup-by-bridge
37
+ * is the alive-row contract. */
38
+ private readonly byBridge;
39
+ /** Filled at promotion time so /list, /meta, /log routes resolve the
40
+ * intrinsic id to the same StoredSession the bridge id resolves to. */
41
+ private readonly byClaude;
42
+ /** Register a freshly-spawned session (claudeSessionId null, jsonlPath
43
+ * null). The row becomes visible to /list immediately. */
44
+ addPending(s: StoredSession): void;
45
+ /** Resolve by either the bridge suffix or the intrinsic claudeSessionId.
46
+ * Returns the same StoredSession in either case once promotion has
47
+ * fired. */
41
48
  get(id: string): StoredSession | undefined;
49
+ /** Remove by either id. Drops both index entries. */
42
50
  remove(id: string): StoredSession | undefined;
43
- listBySender(senderId: string): StoredSession[];
51
+ listBySender(senderId: string, opts?: {
52
+ includeHidden?: boolean;
53
+ }): StoredSession[];
44
54
  all(): StoredSession[];
45
55
  size(): number;
46
- addPending(p: PendingSession): void;
47
- getPending(bridgeSuffix: string): PendingSession | undefined;
48
- removePending(bridgeSuffix: string): PendingSession | undefined;
49
- /** Move a pending entry into the main store under its newly-observed
50
- * `claudeSessionId`. Idempotent: a second call for the same bridge
51
- * suffix is a no-op once the pending entry has been removed.
52
- * Returns the promoted StoredSession, or null when no pending entry
53
- * exists for this bridge suffix (already promoted, cancelled, or
54
- * the PTY exited before observation fired). */
55
- promotePending(bridgeSuffix: string, claudeSessionId: string, jsonlPath: string): StoredSession | null;
56
+ /** Bind a pending row to its newly-observed `claudeSessionId` + JSONL
57
+ * path. Idempotent: a second call on an already-promoted row updates
58
+ * nothing. Returns the StoredSession on success, null when no row
59
+ * exists for the bridge suffix (operator already deleted it, or the
60
+ * PTY exited before observation fired). */
61
+ promote(bridgeSuffix: string, claudeSessionId: string, jsonlPath: string): StoredSession | null;
56
62
  }
57
63
  //# sourceMappingURL=session-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAE1D,MAAM,WAAW,aAAa;IAC5B;;;sBAGkB;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,EAAE,OAAO,CAAA;IAChB;0DACsD;IACtD,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,SAAS,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;CAChB;AAED;;;mEAGmE;AACnE,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,SAAS,CAAA;IACd;4DACwD;IACxD,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoC;IAEpE,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI;IAI3B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI1C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAM7C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE;IAQ/C,GAAG,IAAI,aAAa,EAAE;IAItB,IAAI,IAAI,MAAM;IAMd,UAAU,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI;IAInC,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI5D,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAM/D;;;;;oDAKgD;IAChD,cAAc,CACZ,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,GAChB,aAAa,GAAG,IAAI;CAmBxB"}
1
+ {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAE1D,MAAM,WAAW,aAAa;IAC5B;;;+DAG2D;IAC3D,YAAY,EAAE,MAAM,CAAA;IACpB;;;6DAGyD;IACzD,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,EAAE,OAAO,CAAA;IAChB;gFAC4E;IAC5E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,GAAG,EAAE,SAAS,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf;;;;4DAIwD;IACxD,MAAM,EAAE,OAAO,CAAA;IACf;;6CAEyC;IACzC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,qBAAa,YAAY;IACvB;qCACiC;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D;4EACwE;IACxE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAE5D;+DAC2D;IAC3D,UAAU,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI;IAIlC;;iBAEa;IACb,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI1C,qDAAqD;IACrD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAQ7C,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,aAAa,EAAE;IAWvF,GAAG,IAAI,aAAa,EAAE;IAItB,IAAI,IAAI,MAAM;IAId;;;;gDAI4C;IAC5C,OAAO,CACL,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,GAChB,aAAa,GAAG,IAAI;CASxB"}