@agent-deck/backend 1.5.0 → 1.5.2

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 (143) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/bootstrap/authoring-guide.d.ts +3 -0
  3. package/dist/bootstrap/authoring-guide.d.ts.map +1 -0
  4. package/dist/bootstrap/authoring-guide.js +19 -0
  5. package/dist/bootstrap/authoring-guide.js.map +1 -0
  6. package/dist/bootstrap/cursor-project-slug.d.ts +9 -0
  7. package/dist/bootstrap/cursor-project-slug.d.ts.map +1 -0
  8. package/dist/bootstrap/cursor-project-slug.js +15 -0
  9. package/dist/bootstrap/cursor-project-slug.js.map +1 -0
  10. package/dist/bootstrap/digest-cursor-session.d.ts +11 -0
  11. package/dist/bootstrap/digest-cursor-session.d.ts.map +1 -0
  12. package/dist/bootstrap/digest-cursor-session.js +162 -0
  13. package/dist/bootstrap/digest-cursor-session.js.map +1 -0
  14. package/dist/bootstrap/digest-session.d.ts +3 -0
  15. package/dist/bootstrap/digest-session.d.ts.map +1 -0
  16. package/dist/bootstrap/digest-session.js +356 -0
  17. package/dist/bootstrap/digest-session.js.map +1 -0
  18. package/dist/bootstrap/enumerate-cursor.d.ts +13 -0
  19. package/dist/bootstrap/enumerate-cursor.d.ts.map +1 -0
  20. package/dist/bootstrap/enumerate-cursor.js +105 -0
  21. package/dist/bootstrap/enumerate-cursor.js.map +1 -0
  22. package/dist/bootstrap/enumerate.d.ts +7 -0
  23. package/dist/bootstrap/enumerate.d.ts.map +1 -0
  24. package/dist/bootstrap/enumerate.js +49 -0
  25. package/dist/bootstrap/enumerate.js.map +1 -0
  26. package/dist/bootstrap/extractors.d.ts +18 -0
  27. package/dist/bootstrap/extractors.d.ts.map +1 -0
  28. package/dist/bootstrap/extractors.js +97 -0
  29. package/dist/bootstrap/extractors.js.map +1 -0
  30. package/dist/bootstrap/feedback-lexicon.d.ts +7 -0
  31. package/dist/bootstrap/feedback-lexicon.d.ts.map +1 -0
  32. package/dist/bootstrap/feedback-lexicon.js +24 -0
  33. package/dist/bootstrap/feedback-lexicon.js.map +1 -0
  34. package/dist/bootstrap/feedback-moments.d.ts +3 -0
  35. package/dist/bootstrap/feedback-moments.d.ts.map +1 -0
  36. package/dist/bootstrap/feedback-moments.js +77 -0
  37. package/dist/bootstrap/feedback-moments.js.map +1 -0
  38. package/dist/bootstrap/handoff.d.ts +5 -0
  39. package/dist/bootstrap/handoff.d.ts.map +1 -0
  40. package/dist/bootstrap/handoff.js +22 -0
  41. package/dist/bootstrap/handoff.js.map +1 -0
  42. package/dist/bootstrap/index.d.ts +8 -0
  43. package/dist/bootstrap/index.d.ts.map +1 -0
  44. package/dist/bootstrap/index.js +20 -0
  45. package/dist/bootstrap/index.js.map +1 -0
  46. package/dist/bootstrap/real-intent.d.ts +14 -0
  47. package/dist/bootstrap/real-intent.d.ts.map +1 -0
  48. package/dist/bootstrap/real-intent.js +127 -0
  49. package/dist/bootstrap/real-intent.js.map +1 -0
  50. package/dist/bootstrap/run-bootstrap.d.ts +25 -0
  51. package/dist/bootstrap/run-bootstrap.d.ts.map +1 -0
  52. package/dist/bootstrap/run-bootstrap.js +221 -0
  53. package/dist/bootstrap/run-bootstrap.js.map +1 -0
  54. package/dist/cli-runtime.d.ts +8 -0
  55. package/dist/cli-runtime.d.ts.map +1 -1
  56. package/dist/cli-runtime.js +23 -2
  57. package/dist/cli-runtime.js.map +1 -1
  58. package/dist/export-import/sanitize-for-export.d.ts +2 -0
  59. package/dist/export-import/sanitize-for-export.d.ts.map +1 -1
  60. package/dist/export-import/sanitize-for-export.js +27 -1
  61. package/dist/export-import/sanitize-for-export.js.map +1 -1
  62. package/dist/models/database.d.ts +11 -1
  63. package/dist/models/database.d.ts.map +1 -1
  64. package/dist/models/database.js +196 -1
  65. package/dist/models/database.js.map +1 -1
  66. package/dist/playbooks/playbook-manager.d.ts +5 -1
  67. package/dist/playbooks/playbook-manager.d.ts.map +1 -1
  68. package/dist/playbooks/playbook-manager.js +40 -4
  69. package/dist/playbooks/playbook-manager.js.map +1 -1
  70. package/dist/routes/decks.d.ts +6 -1
  71. package/dist/routes/decks.d.ts.map +1 -1
  72. package/dist/routes/decks.js +49 -1
  73. package/dist/routes/decks.js.map +1 -1
  74. package/dist/routes/export-import.d.ts.map +1 -1
  75. package/dist/routes/export-import.js +4 -0
  76. package/dist/routes/export-import.js.map +1 -1
  77. package/dist/server/index.d.ts.map +1 -1
  78. package/dist/server/index.js +8 -4
  79. package/dist/server/index.js.map +1 -1
  80. package/dist/services/service-manager.d.ts +5 -1
  81. package/dist/services/service-manager.d.ts.map +1 -1
  82. package/dist/services/service-manager.js +50 -7
  83. package/dist/services/service-manager.js.map +1 -1
  84. package/dist/store/atomic-write.d.ts +2 -0
  85. package/dist/store/atomic-write.d.ts.map +1 -0
  86. package/dist/store/atomic-write.js +16 -0
  87. package/dist/store/atomic-write.js.map +1 -0
  88. package/dist/store/content-hash.d.ts +2 -0
  89. package/dist/store/content-hash.d.ts.map +1 -0
  90. package/dist/store/content-hash.js +62 -0
  91. package/dist/store/content-hash.js.map +1 -0
  92. package/dist/store/credential-codec.d.ts +4 -0
  93. package/dist/store/credential-codec.d.ts.map +1 -0
  94. package/dist/store/credential-codec.js +59 -0
  95. package/dist/store/credential-codec.js.map +1 -0
  96. package/dist/store/deck-codec.d.ts +4 -0
  97. package/dist/store/deck-codec.d.ts.map +1 -0
  98. package/dist/store/deck-codec.js +13 -0
  99. package/dist/store/deck-codec.js.map +1 -0
  100. package/dist/store/index.d.ts +5 -0
  101. package/dist/store/index.d.ts.map +1 -0
  102. package/dist/store/index.js +21 -0
  103. package/dist/store/index.js.map +1 -0
  104. package/dist/store/migrate.d.ts +17 -0
  105. package/dist/store/migrate.d.ts.map +1 -0
  106. package/dist/store/migrate.js +146 -0
  107. package/dist/store/migrate.js.map +1 -0
  108. package/dist/store/paths.d.ts +10 -0
  109. package/dist/store/paths.d.ts.map +1 -0
  110. package/dist/store/paths.js +24 -0
  111. package/dist/store/paths.js.map +1 -0
  112. package/dist/store/playbook-codec.d.ts +4 -0
  113. package/dist/store/playbook-codec.d.ts.map +1 -0
  114. package/dist/store/playbook-codec.js +65 -0
  115. package/dist/store/playbook-codec.js.map +1 -0
  116. package/dist/store/reindex.d.ts +27 -0
  117. package/dist/store/reindex.d.ts.map +1 -0
  118. package/dist/store/reindex.js +189 -0
  119. package/dist/store/reindex.js.map +1 -0
  120. package/dist/store/service-codec.d.ts +6 -0
  121. package/dist/store/service-codec.d.ts.map +1 -0
  122. package/dist/store/service-codec.js +25 -0
  123. package/dist/store/service-codec.js.map +1 -0
  124. package/dist/store/startup.d.ts +8 -0
  125. package/dist/store/startup.d.ts.map +1 -0
  126. package/dist/store/startup.js +69 -0
  127. package/dist/store/startup.js.map +1 -0
  128. package/dist/store/writer.d.ts +17 -0
  129. package/dist/store/writer.d.ts.map +1 -0
  130. package/dist/store/writer.js +96 -0
  131. package/dist/store/writer.js.map +1 -0
  132. package/dist/vault/credential-manager.d.ts +6 -1
  133. package/dist/vault/credential-manager.d.ts.map +1 -1
  134. package/dist/vault/credential-manager.js +26 -5
  135. package/dist/vault/credential-manager.js.map +1 -1
  136. package/dist/vault/yaml-sync.d.ts.map +1 -1
  137. package/dist/vault/yaml-sync.js +8 -20
  138. package/dist/vault/yaml-sync.js.map +1 -1
  139. package/package.json +8 -2
  140. package/static-ui/assets/{index-D64LC4cn.js → index-C4c6WJOq.js} +110 -110
  141. package/static-ui/assets/index-DI74jZFZ.css +1 -0
  142. package/static-ui/index.html +2 -2
  143. package/static-ui/assets/index-B1w2Pair.css +0 -1
@@ -0,0 +1,13 @@
1
+ import type { EnumeratedSession } from './enumerate';
2
+ export type EnumeratedCursorSession = EnumeratedSession & {
3
+ projectSlug: string;
4
+ };
5
+ /**
6
+ * Walk `~/.cursor/projects/<slug>/agent-transcripts/` for parent session JSONL.
7
+ * Supports `<sessionId>/<sessionId>.jsonl` and legacy flat `*.jsonl`.
8
+ * Excludes nested subagents directories.
9
+ */
10
+ export declare function enumerateCursorSessions(projectsDir: string): EnumeratedCursorSession[];
11
+ /** Skip Cursor project dirs that are not real workspace path encodings. */
12
+ export declare function isJunkCursorProjectSlug(slug: string): boolean;
13
+ //# sourceMappingURL=enumerate-cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enumerate-cursor.d.ts","sourceRoot":"","sources":["../../src/bootstrap/enumerate-cursor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,MAAM,uBAAuB,GAAG,iBAAiB,GAAG;IACxD,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,uBAAuB,EAAE,CAqBtF;AAED,2EAA2E;AAC3E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAa7D"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.enumerateCursorSessions = enumerateCursorSessions;
7
+ exports.isJunkCursorProjectSlug = isJunkCursorProjectSlug;
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ /**
11
+ * Walk `~/.cursor/projects/<slug>/agent-transcripts/` for parent session JSONL.
12
+ * Supports `<sessionId>/<sessionId>.jsonl` and legacy flat `*.jsonl`.
13
+ * Excludes nested subagents directories.
14
+ */
15
+ function enumerateCursorSessions(projectsDir) {
16
+ let projectEntries;
17
+ try {
18
+ projectEntries = node_fs_1.default.readdirSync(projectsDir, { withFileTypes: true });
19
+ }
20
+ catch {
21
+ return [];
22
+ }
23
+ const sessions = [];
24
+ for (const projectEntry of projectEntries.filter((entry) => entry.isDirectory()).sort(byName)) {
25
+ if (isJunkCursorProjectSlug(projectEntry.name)) {
26
+ continue;
27
+ }
28
+ const transcriptsRoot = node_path_1.default.join(projectsDir, projectEntry.name, 'agent-transcripts');
29
+ if (!node_fs_1.default.existsSync(transcriptsRoot) || !node_fs_1.default.statSync(transcriptsRoot).isDirectory()) {
30
+ continue;
31
+ }
32
+ collectCursorTranscripts(transcriptsRoot, projectEntry.name, sessions);
33
+ }
34
+ return sessions;
35
+ }
36
+ /** Skip Cursor project dirs that are not real workspace path encodings. */
37
+ function isJunkCursorProjectSlug(slug) {
38
+ const trimmed = slug.trim();
39
+ if (!trimmed || trimmed !== slug) {
40
+ return true;
41
+ }
42
+ if (trimmed === 'empty-window') {
43
+ return true;
44
+ }
45
+ // Cursor sometimes uses pure numeric ids for non-folder projects.
46
+ if (/^\d+$/.test(trimmed)) {
47
+ return true;
48
+ }
49
+ return false;
50
+ }
51
+ function collectCursorTranscripts(transcriptsRoot, projectSlug, sessions) {
52
+ let entries;
53
+ try {
54
+ entries = node_fs_1.default.readdirSync(transcriptsRoot, { withFileTypes: true });
55
+ }
56
+ catch {
57
+ return;
58
+ }
59
+ for (const entry of entries.sort(byName)) {
60
+ if (entry.name === 'subagents') {
61
+ continue;
62
+ }
63
+ const fullPath = node_path_1.default.join(transcriptsRoot, entry.name);
64
+ if (entry.isFile() && entry.name.endsWith('.jsonl')) {
65
+ pushSession(sessions, projectSlug, node_path_1.default.basename(entry.name, '.jsonl'), fullPath);
66
+ continue;
67
+ }
68
+ if (!entry.isDirectory()) {
69
+ continue;
70
+ }
71
+ // Nested session dir: <sessionId>/<sessionId>.jsonl (ignore subagents/)
72
+ let nested;
73
+ try {
74
+ nested = node_fs_1.default.readdirSync(fullPath, { withFileTypes: true });
75
+ }
76
+ catch {
77
+ continue;
78
+ }
79
+ for (const nestedEntry of nested.sort(byName)) {
80
+ if (nestedEntry.name === 'subagents' || !nestedEntry.isFile() || !nestedEntry.name.endsWith('.jsonl')) {
81
+ continue;
82
+ }
83
+ const sessionId = node_path_1.default.basename(nestedEntry.name, '.jsonl');
84
+ // Prefer the canonical <sessionId>/<sessionId>.jsonl; still accept other jsonl in the session folder.
85
+ pushSession(sessions, projectSlug, sessionId, node_path_1.default.join(fullPath, nestedEntry.name));
86
+ }
87
+ }
88
+ }
89
+ function pushSession(sessions, projectSlug, sessionId, filePath) {
90
+ try {
91
+ sessions.push({
92
+ sessionId,
93
+ filePath,
94
+ mtimeMs: node_fs_1.default.statSync(filePath).mtimeMs,
95
+ projectSlug,
96
+ });
97
+ }
98
+ catch {
99
+ // Session may disappear while history is being enumerated.
100
+ }
101
+ }
102
+ function byName(left, right) {
103
+ return left.name.localeCompare(right.name);
104
+ }
105
+ //# sourceMappingURL=enumerate-cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enumerate-cursor.js","sourceRoot":"","sources":["../../src/bootstrap/enumerate-cursor.ts"],"names":[],"mappings":";;;;;AAaA,0DAqBC;AAGD,0DAaC;AAlDD,sDAAyB;AACzB,0DAA6B;AAO7B;;;;GAIG;AACH,SAAgB,uBAAuB,CAAC,WAAmB;IACzD,IAAI,cAA2B,CAAC;IAChC,IAAI,CAAC;QACH,cAAc,GAAG,iBAAE,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAA8B,EAAE,CAAC;IAC/C,KAAK,MAAM,YAAY,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9F,IAAI,uBAAuB,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,SAAS;QACX,CAAC;QACD,MAAM,eAAe,GAAG,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QACvF,IAAI,CAAC,iBAAE,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,iBAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACnF,SAAS;QACX,CAAC;QACD,wBAAwB,CAAC,eAAe,EAAE,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,2EAA2E;AAC3E,SAAgB,uBAAuB,CAAC,IAAY;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,kEAAkE;IAClE,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,wBAAwB,CAC/B,eAAuB,EACvB,WAAmB,EACnB,QAAmC;IAEnC,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,GAAG,iBAAE,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpD,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,mBAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;YAClF,SAAS;QACX,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QAED,wEAAwE;QACxE,IAAI,MAAmB,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,iBAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,IAAI,WAAW,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtG,SAAS;YACX,CAAC;YACD,MAAM,SAAS,GAAG,mBAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC5D,sGAAsG;YACtG,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAClB,QAAmC,EACnC,WAAmB,EACnB,SAAiB,EACjB,QAAgB;IAEhB,IAAI,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC;YACZ,SAAS;YACT,QAAQ;YACR,OAAO,EAAE,iBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO;YACtC,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,2DAA2D;IAC7D,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,IAAe,EAAE,KAAgB;IAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type EnumeratedSession = {
2
+ sessionId: string;
3
+ filePath: string;
4
+ mtimeMs: number;
5
+ };
6
+ export declare function enumerateSessions(projectsDir: string): EnumeratedSession[];
7
+ //# sourceMappingURL=enumerate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enumerate.d.ts","sourceRoot":"","sources":["../../src/bootstrap/enumerate.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAmC1E"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.enumerateSessions = enumerateSessions;
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ function enumerateSessions(projectsDir) {
10
+ let workspaceEntries;
11
+ try {
12
+ workspaceEntries = node_fs_1.default.readdirSync(projectsDir, { withFileTypes: true });
13
+ }
14
+ catch {
15
+ return [];
16
+ }
17
+ const sessions = [];
18
+ for (const workspaceEntry of workspaceEntries.filter((entry) => entry.isDirectory()).sort(byName)) {
19
+ const workspaceDir = node_path_1.default.join(projectsDir, workspaceEntry.name);
20
+ let sessionEntries;
21
+ try {
22
+ sessionEntries = node_fs_1.default.readdirSync(workspaceDir, { withFileTypes: true });
23
+ }
24
+ catch {
25
+ continue;
26
+ }
27
+ for (const sessionEntry of sessionEntries.filter(isJsonlFile).sort(byName)) {
28
+ const filePath = node_path_1.default.join(workspaceDir, sessionEntry.name);
29
+ try {
30
+ sessions.push({
31
+ sessionId: node_path_1.default.basename(sessionEntry.name, '.jsonl'),
32
+ filePath,
33
+ mtimeMs: node_fs_1.default.statSync(filePath).mtimeMs,
34
+ });
35
+ }
36
+ catch {
37
+ // A session may disappear while history is being enumerated.
38
+ }
39
+ }
40
+ }
41
+ return sessions;
42
+ }
43
+ function byName(left, right) {
44
+ return left.name.localeCompare(right.name);
45
+ }
46
+ function isJsonlFile(entry) {
47
+ return entry.isFile() && entry.name.endsWith('.jsonl');
48
+ }
49
+ //# sourceMappingURL=enumerate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enumerate.js","sourceRoot":"","sources":["../../src/bootstrap/enumerate.ts"],"names":[],"mappings":";;;;;AASA,8CAmCC;AA5CD,sDAAyB;AACzB,0DAA6B;AAQ7B,SAAgB,iBAAiB,CAAC,WAAmB;IACnD,IAAI,gBAA6B,CAAC;IAElC,IAAI,CAAC;QACH,gBAAgB,GAAG,iBAAE,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAwB,EAAE,CAAC;IACzC,KAAK,MAAM,cAAc,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAClG,MAAM,YAAY,GAAG,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;QACjE,IAAI,cAA2B,CAAC;QAEhC,IAAI,CAAC;YACH,cAAc,GAAG,iBAAE,CAAC,WAAW,CAAC,YAAY,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,KAAK,MAAM,YAAY,IAAI,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC;oBACZ,SAAS,EAAE,mBAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC;oBACrD,QAAQ;oBACR,OAAO,EAAE,iBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO;iBACvC,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,6DAA6D;YAC/D,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,MAAM,CAAC,IAAe,EAAE,KAAgB;IAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,WAAW,CAAC,KAAgB;IACnC,OAAO,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,18 @@
1
+ export type AssistantActionSummary = {
2
+ summary: string;
3
+ filePaths: string[];
4
+ toolNames: string[];
5
+ bashCommands: string[];
6
+ skills: string[];
7
+ };
8
+ export declare function normalizeBashCommand(command: string): string;
9
+ export declare function summarizeAssistantAction(line: unknown): AssistantActionSummary;
10
+ export declare function extractSkillsFromUserText(text: string): string[];
11
+ export declare function deriveOutcome(commands: {
12
+ command: string;
13
+ count: number;
14
+ }[]): {
15
+ signal: 'pr_opened' | 'committed' | 'unknown';
16
+ evidence?: string;
17
+ };
18
+ //# sourceMappingURL=extractors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractors.d.ts","sourceRoot":"","sources":["../../src/bootstrap/extractors.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAUF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAsB5D;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,sBAAsB,CA4C9E;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAehE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG;IAC7E,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAYA"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeBashCommand = normalizeBashCommand;
4
+ exports.summarizeAssistantAction = summarizeAssistantAction;
5
+ exports.extractSkillsFromUserText = extractSkillsFromUserText;
6
+ exports.deriveOutcome = deriveOutcome;
7
+ function isRecord(value) {
8
+ return typeof value === 'object' && value !== null;
9
+ }
10
+ function commandTokens(command) {
11
+ return command.match(/(?:[^\s"'\\]|\\.)+|"[^"]*"|'[^']*'/g) ?? [];
12
+ }
13
+ function normalizeBashCommand(command) {
14
+ const tokens = commandTokens(command);
15
+ let index = 0;
16
+ while (/^[A-Za-z_][\w]*=/.test(tokens[index] ?? '') || /^-/.test(tokens[index] ?? '')) {
17
+ index += 1;
18
+ }
19
+ const significant = tokens.slice(index);
20
+ if (significant.length === 0) {
21
+ return '';
22
+ }
23
+ const [program] = significant;
24
+ // Guard non-alpha program tokens (e.g. `(`, `{`, redirects) — not real commands.
25
+ if (!program || !/^[A-Za-z]/.test(program.replace(/^["']|["']$/g, ''))) {
26
+ return '';
27
+ }
28
+ const bareProgram = program.replace(/^["']|["']$/g, '');
29
+ const tokenCount = bareProgram === 'gh' ? 3 : ['git', 'npm', 'npx'].includes(bareProgram) ? 2 : 1;
30
+ return significant.slice(0, tokenCount).join(' ');
31
+ }
32
+ function summarizeAssistantAction(line) {
33
+ const content = isRecord(line) && isRecord(line.message) ? line.message.content : undefined;
34
+ const toolNames = [];
35
+ const filePaths = [];
36
+ const bashCommands = [];
37
+ const skills = [];
38
+ if (!Array.isArray(content)) {
39
+ return { summary: '', filePaths, toolNames, bashCommands, skills };
40
+ }
41
+ for (const block of content) {
42
+ if (!isRecord(block) || block.type !== 'tool_use' || typeof block.name !== 'string') {
43
+ continue;
44
+ }
45
+ toolNames.push(block.name);
46
+ const input = isRecord(block.input) ? block.input : {};
47
+ if (block.name === 'Bash' || block.name === 'Shell') {
48
+ if (typeof input.command === 'string') {
49
+ bashCommands.push(input.command);
50
+ }
51
+ }
52
+ if (block.name === 'Skill' && typeof input.skill === 'string' && input.skill.trim()) {
53
+ skills.push(input.skill.trim());
54
+ }
55
+ const filePath = typeof input.file_path === 'string' && input.file_path.trim()
56
+ ? input.file_path
57
+ : typeof input.path === 'string' && input.path.trim()
58
+ ? input.path
59
+ : null;
60
+ if ((block.name === 'Edit' || block.name === 'Write' || block.name === 'StrReplace') && filePath) {
61
+ filePaths.push(filePath);
62
+ }
63
+ }
64
+ return {
65
+ summary: toolNames.join(', '),
66
+ filePaths,
67
+ toolNames,
68
+ bashCommands,
69
+ skills,
70
+ };
71
+ }
72
+ function extractSkillsFromUserText(text) {
73
+ const skills = [];
74
+ const slash = text.match(/^\s*\/([a-z0-9][\w-]*)/i);
75
+ if (slash) {
76
+ skills.push(slash[1]);
77
+ }
78
+ for (const match of text.matchAll(/<command-name>\s*([^<]+?)\s*<\/command-name>/gi)) {
79
+ const skill = match[1].trim();
80
+ if (skill) {
81
+ skills.push(skill);
82
+ }
83
+ }
84
+ return skills;
85
+ }
86
+ function deriveOutcome(commands) {
87
+ const pr = commands.find(({ command }) => command.includes('gh pr create'));
88
+ if (pr) {
89
+ return { signal: 'pr_opened', evidence: pr.command };
90
+ }
91
+ const commit = commands.find(({ command }) => command.includes('git commit'));
92
+ if (commit) {
93
+ return { signal: 'committed', evidence: commit.command };
94
+ }
95
+ return { signal: 'unknown' };
96
+ }
97
+ //# sourceMappingURL=extractors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractors.js","sourceRoot":"","sources":["../../src/bootstrap/extractors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { PolarityHint } from '@agent-deck/shared';
2
+ export type FeedbackMarkers = {
3
+ markers: string[];
4
+ polarityHint: PolarityHint;
5
+ };
6
+ export declare function extractFeedbackMarkers(text: string): FeedbackMarkers;
7
+ //# sourceMappingURL=feedback-lexicon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-lexicon.d.ts","sourceRoot":"","sources":["../../src/bootstrap/feedback-lexicon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AAOF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAepE"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractFeedbackMarkers = extractFeedbackMarkers;
4
+ const NEGATIVE_MARKERS = ['no', "don't", 'do not', 'actually', 'instead', 'wrong', 'revert', 'undo', 'never', 'stop'];
5
+ const POSITIVE_MARKERS = ['perfect', 'works', 'great', 'ship it', 'lgtm', 'exactly'];
6
+ function matchesMarker(text, marker) {
7
+ const escaped = marker.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
8
+ return new RegExp(`\\b${escaped}\\b`, 'i').test(text);
9
+ }
10
+ function extractFeedbackMarkers(text) {
11
+ const negative = NEGATIVE_MARKERS.filter((marker) => matchesMarker(text, marker));
12
+ const positive = POSITIVE_MARKERS.filter((marker) => matchesMarker(text, marker));
13
+ return {
14
+ markers: [...negative, ...positive],
15
+ polarityHint: negative.length > 0 && positive.length > 0
16
+ ? 'mixed'
17
+ : negative.length > 0
18
+ ? 'negative'
19
+ : positive.length > 0
20
+ ? 'positive'
21
+ : 'unknown',
22
+ };
23
+ }
24
+ //# sourceMappingURL=feedback-lexicon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-lexicon.js","sourceRoot":"","sources":["../../src/bootstrap/feedback-lexicon.ts"],"names":[],"mappings":";;AAeA,wDAeC;AA5BD,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AACtH,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAOrF,SAAS,aAAa,CAAC,IAAY,EAAE,MAAc;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAC9D,OAAO,IAAI,MAAM,CAAC,MAAM,OAAO,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,SAAgB,sBAAsB,CAAC,IAAY;IACjD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAElF,OAAO;QACL,OAAO,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC;QACnC,YAAY,EACV,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YACxC,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACnB,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;oBACnB,CAAC,CAAC,UAAU;oBACZ,CAAC,CAAC,SAAS;KACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FeedbackMoment } from '@agent-deck/shared';
2
+ export declare function extractFeedbackMoments(events: unknown[]): FeedbackMoment[];
3
+ //# sourceMappingURL=feedback-moments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-moments.d.ts","sourceRoot":"","sources":["../../src/bootstrap/feedback-moments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAqDzD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CA0C1E"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractFeedbackMoments = extractFeedbackMoments;
4
+ const extractors_1 = require("./extractors");
5
+ const feedback_lexicon_1 = require("./feedback-lexicon");
6
+ const real_intent_1 = require("./real-intent");
7
+ const AGENT_ACTION_MAX_LENGTH = 400;
8
+ const USER_REACTION_MAX_LENGTH = 600;
9
+ function isAssistantLine(line) {
10
+ if (typeof line !== 'object' || line === null) {
11
+ return false;
12
+ }
13
+ const record = line;
14
+ const messageRole = record.message && typeof record.message === 'object' ? record.message.role : undefined;
15
+ return record.type === 'assistant' || record.role === 'assistant' || messageRole === 'assistant';
16
+ }
17
+ function timestampFor(line) {
18
+ const timestamp = typeof line === 'object' && line !== null ? line.timestamp : undefined;
19
+ return typeof timestamp === 'string' && !Number.isNaN(Date.parse(timestamp)) ? new Date(timestamp).toISOString() : undefined;
20
+ }
21
+ function truncate(value, maxLength) {
22
+ return value.slice(0, maxLength);
23
+ }
24
+ function nextReedit(lines, startIndex, touchedPaths) {
25
+ if (touchedPaths.length === 0) {
26
+ return undefined;
27
+ }
28
+ // F2.1: only the next tool-using assistant line counts; unrelated tools stop the scan.
29
+ for (let index = startIndex + 1; index < lines.length; index += 1) {
30
+ if (!isAssistantLine(lines[index])) {
31
+ continue;
32
+ }
33
+ const action = (0, extractors_1.summarizeAssistantAction)(lines[index]);
34
+ if (action.toolNames.length === 0) {
35
+ continue;
36
+ }
37
+ return action.filePaths.some((filePath) => touchedPaths.includes(filePath)) ? action : undefined;
38
+ }
39
+ return undefined;
40
+ }
41
+ function extractFeedbackMoments(events) {
42
+ const moments = [];
43
+ let precedingAction;
44
+ for (let index = 0; index < events.length && moments.length < 30; index += 1) {
45
+ const event = events[index];
46
+ if (isAssistantLine(event)) {
47
+ const summary = (0, extractors_1.summarizeAssistantAction)(event);
48
+ // Keep last tool action across prose-only assistant lines until the next tool_use.
49
+ if (summary.toolNames.length > 0) {
50
+ precedingAction = { summary, index };
51
+ }
52
+ continue;
53
+ }
54
+ if (!(0, real_intent_1.isRealUserIntent)(event) || !precedingAction) {
55
+ continue;
56
+ }
57
+ const userReaction = (0, real_intent_1.extractUserText)(event);
58
+ if (userReaction === null) {
59
+ continue;
60
+ }
61
+ const { markers, polarityHint } = (0, feedback_lexicon_1.extractFeedbackMarkers)(userReaction);
62
+ const followup = nextReedit(events, index, precedingAction.summary.filePaths);
63
+ if (markers.length === 0 && !followup) {
64
+ continue;
65
+ }
66
+ moments.push({
67
+ agentAction: truncate(precedingAction.summary.summary, AGENT_ACTION_MAX_LENGTH),
68
+ userReaction: truncate(userReaction, USER_REACTION_MAX_LENGTH),
69
+ polarityHint,
70
+ markers,
71
+ ...(followup ? { followupChange: truncate(followup.summary, AGENT_ACTION_MAX_LENGTH) } : {}),
72
+ ...(timestampFor(event) ? { at: timestampFor(event) } : {}),
73
+ });
74
+ }
75
+ return moments;
76
+ }
77
+ //# sourceMappingURL=feedback-moments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-moments.js","sourceRoot":"","sources":["../../src/bootstrap/feedback-moments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { BootstrapResult } from './run-bootstrap';
2
+ export declare const PRIVACY_NOTE = "Note: digests include verbatim user-reaction excerpts. Parsing is local; digests enter your agent context when authoring.";
3
+ export declare function formatHandoffBlock(result: BootstrapResult): string;
4
+ export declare function formatBootstrapOutput(result: BootstrapResult): string;
5
+ //# sourceMappingURL=handoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../../src/bootstrap/handoff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,eAAO,MAAM,YAAY,8HACoG,CAAC;AAE9H,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAUlE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAErE"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PRIVACY_NOTE = void 0;
4
+ exports.formatHandoffBlock = formatHandoffBlock;
5
+ exports.formatBootstrapOutput = formatBootstrapOutput;
6
+ const authoring_guide_1 = require("./authoring-guide");
7
+ exports.PRIVACY_NOTE = 'Note: digests include verbatim user-reaction excerpts. Parsing is local; digests enter your agent context when authoring.';
8
+ function formatHandoffBlock(result) {
9
+ return [
10
+ '--- agent-deck bootstrap handoff ---',
11
+ `1. Load the authoring guide: ${result.guidePath}`,
12
+ ` (guideRef: ${authoring_guide_1.GUIDE_REF})`,
13
+ `2. Read the manifest: ${result.manifestPath}`,
14
+ '3. Bind the workspace you are in, then propose playbooks for the bound deck only',
15
+ ' (load digests whose workspaceRoot or workspaceSlug matches; hold others).',
16
+ '--- end handoff ---',
17
+ ].join('\n');
18
+ }
19
+ function formatBootstrapOutput(result) {
20
+ return `${exports.PRIVACY_NOTE}\n${formatHandoffBlock(result)}`;
21
+ }
22
+ //# sourceMappingURL=handoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/bootstrap/handoff.ts"],"names":[],"mappings":";;;AAMA,gDAUC;AAED,sDAEC;AAnBD,uDAA8C;AAEjC,QAAA,YAAY,GACvB,2HAA2H,CAAC;AAE9H,SAAgB,kBAAkB,CAAC,MAAuB;IACxD,OAAO;QACL,sCAAsC;QACtC,gCAAgC,MAAM,CAAC,SAAS,EAAE;QAClD,iBAAiB,2BAAS,GAAG;QAC7B,yBAAyB,MAAM,CAAC,YAAY,EAAE;QAC9C,kFAAkF;QAClF,8EAA8E;QAC9E,qBAAqB;KACtB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAgB,qBAAqB,CAAC,MAAuB;IAC3D,OAAO,GAAG,oBAAY,KAAK,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { digestSession } from './digest-session';
2
+ export { digestCursorSession } from './digest-cursor-session';
3
+ export { encodeCursorProjectSlug } from './cursor-project-slug';
4
+ export { extractFeedbackMoments } from './feedback-moments';
5
+ export { GUIDE_REF } from './authoring-guide';
6
+ export { formatBootstrapOutput, formatHandoffBlock, PRIVACY_NOTE } from './handoff';
7
+ export { runBootstrap, type BootstrapOptions, type BootstrapResult, type BootstrapHostOption, } from './run-bootstrap';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bootstrap/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACpF,OAAO,EACL,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,mBAAmB,GACzB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runBootstrap = exports.PRIVACY_NOTE = exports.formatHandoffBlock = exports.formatBootstrapOutput = exports.GUIDE_REF = exports.extractFeedbackMoments = exports.encodeCursorProjectSlug = exports.digestCursorSession = exports.digestSession = void 0;
4
+ var digest_session_1 = require("./digest-session");
5
+ Object.defineProperty(exports, "digestSession", { enumerable: true, get: function () { return digest_session_1.digestSession; } });
6
+ var digest_cursor_session_1 = require("./digest-cursor-session");
7
+ Object.defineProperty(exports, "digestCursorSession", { enumerable: true, get: function () { return digest_cursor_session_1.digestCursorSession; } });
8
+ var cursor_project_slug_1 = require("./cursor-project-slug");
9
+ Object.defineProperty(exports, "encodeCursorProjectSlug", { enumerable: true, get: function () { return cursor_project_slug_1.encodeCursorProjectSlug; } });
10
+ var feedback_moments_1 = require("./feedback-moments");
11
+ Object.defineProperty(exports, "extractFeedbackMoments", { enumerable: true, get: function () { return feedback_moments_1.extractFeedbackMoments; } });
12
+ var authoring_guide_1 = require("./authoring-guide");
13
+ Object.defineProperty(exports, "GUIDE_REF", { enumerable: true, get: function () { return authoring_guide_1.GUIDE_REF; } });
14
+ var handoff_1 = require("./handoff");
15
+ Object.defineProperty(exports, "formatBootstrapOutput", { enumerable: true, get: function () { return handoff_1.formatBootstrapOutput; } });
16
+ Object.defineProperty(exports, "formatHandoffBlock", { enumerable: true, get: function () { return handoff_1.formatHandoffBlock; } });
17
+ Object.defineProperty(exports, "PRIVACY_NOTE", { enumerable: true, get: function () { return handoff_1.PRIVACY_NOTE; } });
18
+ var run_bootstrap_1 = require("./run-bootstrap");
19
+ Object.defineProperty(exports, "runBootstrap", { enumerable: true, get: function () { return run_bootstrap_1.runBootstrap; } });
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bootstrap/index.ts"],"names":[],"mappings":";;;AAAA,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA;AAC5B,6DAAgE;AAAvD,8HAAA,uBAAuB,OAAA;AAChC,uDAA4D;AAAnD,0HAAA,sBAAsB,OAAA;AAC/B,qDAA8C;AAArC,4GAAA,SAAS,OAAA;AAClB,qCAAoF;AAA3E,gHAAA,qBAAqB,OAAA;AAAE,6GAAA,kBAAkB,OAAA;AAAE,uGAAA,YAAY,OAAA;AAChE,iDAKyB;AAJvB,6GAAA,YAAY,OAAA"}
@@ -0,0 +1,14 @@
1
+ /** Raw message text before Cursor envelope unwrap. */
2
+ export declare function extractRawUserText(line: unknown): string | null;
3
+ /**
4
+ * Strip Cursor `<timestamp>` / unwrap `<user_query>…</user_query>`.
5
+ * Claude string content is unchanged (no those tags).
6
+ */
7
+ export declare function unwrapCursorUserEnvelope(raw: string): string;
8
+ /** Host-injected user-role text for both Claude and Cursor (not a human task intent). */
9
+ export declare function isHostInjectedUserText(raw: string): boolean;
10
+ /** @deprecated Prefer isHostInjectedUserText — kept for call-site clarity in Cursor-focused tests. */
11
+ export declare function isCursorHostInjection(raw: string): boolean;
12
+ export declare function extractUserText(line: unknown): string | null;
13
+ export declare function isRealUserIntent(line: unknown): boolean;
14
+ //# sourceMappingURL=real-intent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"real-intent.d.ts","sourceRoot":"","sources":["../../src/bootstrap/real-intent.ts"],"names":[],"mappings":"AAyCA,sDAAsD;AACtD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAe/D;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO5D;AAED,yFAAyF;AACzF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAS3D;AAED,sGAAsG;AACtG,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAO5D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAwDvD"}