let-them-talk 5.2.5 → 5.4.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 (166) hide show
  1. package/CHANGELOG.md +3 -1
  2. package/README.md +158 -592
  3. package/SECURITY.md +3 -3
  4. package/USAGE.md +151 -0
  5. package/agent-contracts.js +447 -0
  6. package/api-agents.js +760 -0
  7. package/autonomy/decision-v2.js +380 -0
  8. package/autonomy/watchdog-policy.js +572 -0
  9. package/cli.js +454 -298
  10. package/conversation-templates/autonomous-feature.json +83 -22
  11. package/conversation-templates/code-review.json +69 -21
  12. package/conversation-templates/debug-squad.json +69 -21
  13. package/conversation-templates/feature-build.json +69 -21
  14. package/conversation-templates/research-write.json +69 -21
  15. package/dashboard.html +3148 -174
  16. package/dashboard.js +823 -786
  17. package/data-dir.js +58 -0
  18. package/docs/architecture/branch-semantics.md +157 -0
  19. package/docs/architecture/canonical-event-schema.md +88 -0
  20. package/docs/architecture/markdown-workspace.md +183 -0
  21. package/docs/architecture/runtime-contract.md +459 -0
  22. package/docs/architecture/runtime-migration-hardening.md +64 -0
  23. package/events/hooks.js +154 -0
  24. package/events/log.js +457 -0
  25. package/events/replay.js +33 -0
  26. package/events/schema.js +432 -0
  27. package/managed-team-integration.js +261 -0
  28. package/office/agents.js +704 -597
  29. package/office/animation.js +1 -1
  30. package/office/assets/arcade-cabinet.js +141 -0
  31. package/office/assets/archway.js +77 -0
  32. package/office/assets/bar-counter.js +91 -0
  33. package/office/assets/bar-stool.js +71 -0
  34. package/office/assets/beanbag.js +64 -0
  35. package/office/assets/bench.js +99 -0
  36. package/office/assets/bollard.js +87 -0
  37. package/office/assets/cactus.js +100 -0
  38. package/office/assets/carpet-tile.js +46 -0
  39. package/office/assets/chair.js +123 -0
  40. package/office/assets/chandelier.js +107 -0
  41. package/office/assets/coffee-machine.js +95 -0
  42. package/office/assets/coffee-table.js +81 -0
  43. package/office/assets/column.js +95 -0
  44. package/office/assets/desk-lamp.js +102 -0
  45. package/office/assets/desk.js +76 -0
  46. package/office/assets/dining-table.js +105 -0
  47. package/office/assets/door.js +70 -0
  48. package/office/assets/dual-monitor.js +72 -0
  49. package/office/assets/fence.js +76 -0
  50. package/office/assets/filing-cabinet.js +111 -0
  51. package/office/assets/floor-lamp.js +69 -0
  52. package/office/assets/floor-tile.js +54 -0
  53. package/office/assets/flower-pot.js +76 -0
  54. package/office/assets/foosball.js +95 -0
  55. package/office/assets/fridge.js +99 -0
  56. package/office/assets/gaming-chair.js +154 -0
  57. package/office/assets/gaming-desk.js +105 -0
  58. package/office/assets/glass-door.js +72 -0
  59. package/office/assets/glass-wall.js +64 -0
  60. package/office/assets/half-wall.js +49 -0
  61. package/office/assets/hanging-plant.js +112 -0
  62. package/office/assets/index.js +151 -0
  63. package/office/assets/indoor-tree.js +90 -0
  64. package/office/assets/l-sofa.js +153 -0
  65. package/office/assets/marble-floor.js +64 -0
  66. package/office/assets/materials.js +40 -0
  67. package/office/assets/meeting-table.js +88 -0
  68. package/office/assets/microwave.js +94 -0
  69. package/office/assets/monitor.js +67 -0
  70. package/office/assets/neon-strip.js +73 -0
  71. package/office/assets/painting.js +84 -0
  72. package/office/assets/palm-tree.js +108 -0
  73. package/office/assets/pc-tower.js +91 -0
  74. package/office/assets/pendant-light.js +67 -0
  75. package/office/assets/ping-pong.js +114 -0
  76. package/office/assets/plant.js +72 -0
  77. package/office/assets/planter-box.js +95 -0
  78. package/office/assets/pool-table.js +94 -0
  79. package/office/assets/printer.js +113 -0
  80. package/office/assets/reception-desk.js +133 -0
  81. package/office/assets/rug.js +78 -0
  82. package/office/assets/sculpture.js +85 -0
  83. package/office/assets/server-rack.js +98 -0
  84. package/office/assets/sink.js +109 -0
  85. package/office/assets/sofa.js +106 -0
  86. package/office/assets/speaker.js +83 -0
  87. package/office/assets/spotlight.js +83 -0
  88. package/office/assets/street-lamp.js +97 -0
  89. package/office/assets/trash-can.js +83 -0
  90. package/office/assets/treadmill.js +126 -0
  91. package/office/assets/trophy.js +89 -0
  92. package/office/assets/tv-screen.js +79 -0
  93. package/office/assets/vase.js +84 -0
  94. package/office/assets/wall-clock.js +84 -0
  95. package/office/assets/wall.js +53 -0
  96. package/office/assets/water-cooler.js +146 -0
  97. package/office/assets/whiteboard.js +115 -0
  98. package/office/assets.js +3 -431
  99. package/office/builder.js +791 -355
  100. package/office/campus-env.js +1012 -1119
  101. package/office/environment.js +2 -0
  102. package/office/gallery.js +997 -0
  103. package/office/index.js +165 -61
  104. package/office/navigation.js +173 -152
  105. package/office/player.js +178 -68
  106. package/office/robot-character.js +272 -0
  107. package/office/spectator-camera.js +33 -10
  108. package/office/state.js +2 -0
  109. package/office/world-save.js +35 -4
  110. package/package.json +57 -3
  111. package/providers/comfyui.js +383 -0
  112. package/providers/dalle.js +79 -0
  113. package/providers/gemini.js +181 -0
  114. package/providers/ollama.js +184 -0
  115. package/providers/replicate.js +115 -0
  116. package/providers/zai.js +183 -0
  117. package/runtime-descriptor.js +270 -0
  118. package/scripts/check-agent-contract-advisory.js +132 -0
  119. package/scripts/check-api-agent-parity.js +277 -0
  120. package/scripts/check-autonomy-v2-decision.js +207 -0
  121. package/scripts/check-autonomy-v2-execution.js +588 -0
  122. package/scripts/check-autonomy-v2-watchdog.js +224 -0
  123. package/scripts/check-branch-fork-snapshot.js +337 -0
  124. package/scripts/check-branch-isolation.js +787 -0
  125. package/scripts/check-branch-semantics.js +139 -0
  126. package/scripts/check-dashboard-control-plane.js +1304 -0
  127. package/scripts/check-docs-onboarding.js +490 -0
  128. package/scripts/check-event-schema.js +276 -0
  129. package/scripts/check-evidence-completion.js +239 -0
  130. package/scripts/check-invariants.js +992 -0
  131. package/scripts/check-lifecycle-hooks.js +525 -0
  132. package/scripts/check-managed-team-integration.js +166 -0
  133. package/scripts/check-markdown-workspace-export.js +548 -0
  134. package/scripts/check-markdown-workspace-safety.js +347 -0
  135. package/scripts/check-markdown-workspace.js +136 -0
  136. package/scripts/check-message-replay.js +429 -0
  137. package/scripts/check-migration-hardening.js +300 -0
  138. package/scripts/check-performance-indexing.js +272 -0
  139. package/scripts/check-provider-capabilities.js +316 -0
  140. package/scripts/check-runtime-contract.js +109 -0
  141. package/scripts/check-session-aware-context.js +172 -0
  142. package/scripts/check-session-lifecycle.js +210 -0
  143. package/scripts/export-markdown-workspace.js +84 -0
  144. package/scripts/fixtures/message-replay/clean.jsonl +2 -0
  145. package/scripts/fixtures/message-replay/corrupt-correction-payload.jsonl +1 -0
  146. package/scripts/fixtures/message-replay/corrupt-jsonl.jsonl +1 -0
  147. package/scripts/fixtures/message-replay/corrupt-payload.jsonl +1 -0
  148. package/scripts/fixtures/message-replay/out-of-order.jsonl +2 -0
  149. package/scripts/migrate-legacy-to-canonical.js +201 -0
  150. package/scripts/run-verification-suite.js +242 -0
  151. package/scripts/sync-packaged-docs.js +69 -0
  152. package/server.js +9546 -7214
  153. package/state/agents.js +161 -0
  154. package/state/canonical.js +3068 -0
  155. package/state/dashboard-queries.js +441 -0
  156. package/state/evidence.js +56 -0
  157. package/state/io.js +69 -0
  158. package/state/markdown-workspace.js +951 -0
  159. package/state/messages.js +669 -0
  160. package/state/sessions.js +683 -0
  161. package/state/tasks-workflows.js +92 -0
  162. package/templates/debate.json +2 -2
  163. package/templates/managed.json +4 -4
  164. package/templates/pair.json +2 -2
  165. package/templates/review.json +2 -2
  166. package/templates/team.json +3 -3
@@ -0,0 +1,161 @@
1
+ function cloneJsonValue(value) {
2
+ return value == null ? value : JSON.parse(JSON.stringify(value));
3
+ }
4
+
5
+ function createAgentsState(options = {}) {
6
+ const {
7
+ io,
8
+ agentsFile,
9
+ profilesFile,
10
+ heartbeatFile,
11
+ lockAgentsFile,
12
+ unlockAgentsFile,
13
+ withAgentsFileLock,
14
+ processPid,
15
+ } = options;
16
+
17
+ function withAgentsLock(fn) {
18
+ if (typeof withAgentsFileLock === 'function') {
19
+ return withAgentsFileLock(fn);
20
+ }
21
+ if (typeof lockAgentsFile === 'function') lockAgentsFile();
22
+ try {
23
+ return fn();
24
+ } finally {
25
+ if (typeof unlockAgentsFile === 'function') unlockAgentsFile();
26
+ }
27
+ }
28
+
29
+ function saveAgents(agents) {
30
+ io.writeJson(agentsFile, agents, { cacheKey: 'agents' });
31
+ return agents;
32
+ }
33
+
34
+ function readProfiles() {
35
+ if (!profilesFile) return {};
36
+ return io.readJsonFile(profilesFile, {}) || {};
37
+ }
38
+
39
+ function saveProfiles(profiles) {
40
+ if (!profilesFile) return profiles;
41
+ io.writeJson(profilesFile, profiles, { cacheKey: 'profiles', space: 2 });
42
+ return profiles;
43
+ }
44
+
45
+ function readAgent(name) {
46
+ if (!name) return null;
47
+ const agents = io.readJsonFile(agentsFile, {}) || {};
48
+ return agents[name] ? cloneJsonValue(agents[name]) : null;
49
+ }
50
+
51
+ function touchHeartbeat(name, at = new Date().toISOString()) {
52
+ if (!name) return;
53
+
54
+ io.writeJson(heartbeatFile(name), {
55
+ last_activity: at,
56
+ pid: processPid,
57
+ });
58
+
59
+ return {
60
+ last_activity: at,
61
+ pid: processPid,
62
+ };
63
+ }
64
+
65
+ function updateAgent(name, updater) {
66
+ if (!name) return false;
67
+
68
+ return withAgentsLock(() => {
69
+ const agents = io.readJsonFile(agentsFile, {}) || {};
70
+ if (!agents[name]) return false;
71
+
72
+ updater(agents[name], agents);
73
+ saveAgents(agents);
74
+ return cloneJsonValue(agents[name]);
75
+ });
76
+ }
77
+
78
+ function setAgent(name, value) {
79
+ if (!name) return null;
80
+
81
+ return withAgentsLock(() => {
82
+ const agents = io.readJsonFile(agentsFile, {}) || {};
83
+ agents[name] = value;
84
+ saveAgents(agents);
85
+ return cloneJsonValue(agents[name]);
86
+ });
87
+ }
88
+
89
+ function removeAgent(name) {
90
+ if (!name) return false;
91
+
92
+ return withAgentsLock(() => {
93
+ const agents = io.readJsonFile(agentsFile, {}) || {};
94
+ if (!agents[name]) return false;
95
+ const removed = cloneJsonValue(agents[name]);
96
+ delete agents[name];
97
+ saveAgents(agents);
98
+ return removed;
99
+ });
100
+ }
101
+
102
+ function updateProfile(name, updater) {
103
+ if (!name || !profilesFile) return null;
104
+
105
+ return io.withLock(profilesFile, () => {
106
+ const profiles = readProfiles();
107
+ if (!profiles[name]) profiles[name] = {};
108
+ updater(profiles[name], profiles);
109
+ saveProfiles(profiles);
110
+ return profiles[name];
111
+ });
112
+ }
113
+
114
+ function deleteProfile(name) {
115
+ if (!name || !profilesFile) return false;
116
+
117
+ return io.withLock(profilesFile, () => {
118
+ const profiles = readProfiles();
119
+ if (!profiles[name]) return false;
120
+ delete profiles[name];
121
+ saveProfiles(profiles);
122
+ return true;
123
+ });
124
+ }
125
+
126
+ function setListeningState(name, isListening, at = new Date().toISOString()) {
127
+ return updateAgent(name, (agent) => {
128
+ agent.listening_since = isListening ? at : null;
129
+ // Stamp last_listened_at on BOTH start and stop. On start this records
130
+ // "we're listening right now"; on stop it records "we were listening
131
+ // up to this moment" so callers can apply a recency grace window
132
+ // rather than treating every brief listen-return as "working".
133
+ agent.last_listened_at = at;
134
+ });
135
+ }
136
+
137
+ function setBranch(name, branchName, at = new Date().toISOString()) {
138
+ return updateAgent(name, (agent) => {
139
+ agent.branch = branchName;
140
+ agent.last_activity = at;
141
+ });
142
+ }
143
+
144
+ return {
145
+ saveAgents,
146
+ saveProfiles,
147
+ readProfiles,
148
+ readAgent,
149
+ touchHeartbeat,
150
+ updateAgent,
151
+ setAgent,
152
+ removeAgent,
153
+ updateProfile,
154
+ deleteProfile,
155
+ setListeningState,
156
+ setBranch,
157
+ withAgentsLock,
158
+ };
159
+ }
160
+
161
+ module.exports = { createAgentsState };