reflectt-node 0.1.18 → 0.1.19

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.
@@ -39,6 +39,8 @@ export interface SweepDeps {
39
39
  assignee?: string;
40
40
  status?: Task['status'] | Task['status'][];
41
41
  }): Task[];
42
+ /** Get all known agent IDs (for seeding canvas with all agents) */
43
+ listAllAgents?(): string[];
42
44
  /** Get current canvas state entry for an agent (null if never set) */
43
45
  getCanvasState(agentId: string): CanvasStateEntry | null;
44
46
  /** Emit a synthetic canvas state event */
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-auto-state.d.ts","sourceRoot":"","sources":["../src/canvas-auto-state.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEtC,eAAO,MAAM,gBAAgB,OAAQ,CAAA;AACrC,eAAO,MAAM,uBAAuB,OAAQ,CAAA;AAE5C,MAAM,MAAM,WAAW,GACnB,OAAO,GACP,SAAS,GACT,WAAW,GACX,UAAU,GACV,WAAW,GACX,UAAU,GACV,QAAQ,GACR,SAAS,CAAA;AAGb,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,WAAW,CAW5D;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,WAAW,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,qDAAqD;IACrD,SAAS,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;KAAE,GAAG,IAAI,EAAE,CAAA;IAC1F,sEAAsE;IACtE,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAA;IACxD,0CAA0C;IAC1C,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpG,sEAAsE;IACtE,gBAAgB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;IACpD,2EAA2E;IAC3E,kBAAkB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;CACvD;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,GAAG,WAAW,CAgFpE"}
1
+ {"version":3,"file":"canvas-auto-state.d.ts","sourceRoot":"","sources":["../src/canvas-auto-state.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEtC,eAAO,MAAM,gBAAgB,OAAQ,CAAA;AACrC,eAAO,MAAM,uBAAuB,OAAQ,CAAA;AAE5C,MAAM,MAAM,WAAW,GACnB,OAAO,GACP,SAAS,GACT,WAAW,GACX,UAAU,GACV,WAAW,GACX,UAAU,GACV,QAAQ,GACR,SAAS,CAAA;AAGb,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,WAAW,CAW5D;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,WAAW,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,qDAAqD;IACrD,SAAS,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;KAAE,GAAG,IAAI,EAAE,CAAA;IAC1F,mEAAmE;IACnE,aAAa,CAAC,IAAI,MAAM,EAAE,CAAA;IAC1B,sEAAsE;IACtE,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAA;IACxD,0CAA0C;IAC1C,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpG,sEAAsE;IACtE,gBAAgB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;IACpD,2EAA2E;IAC3E,kBAAkB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;CACvD;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,GAAG,WAAW,CAuFpE"}
@@ -57,9 +57,16 @@ export function runCanvasAutoStateSweep(deps) {
57
57
  list.push(task);
58
58
  byAgent.set(task.assignee, list);
59
59
  }
60
- // Also include agents who have been seen on canvas (may now be idle)
61
- // so we can flip them back to floor when they finish
62
- // (This is handled by the caller passing a set of known canvas agents)
60
+ // Also include ALL known agents (even without tasks) so they're visible on canvas
61
+ // This ensures all team members show up, not just those with active tasks
62
+ const allAgents = deps.listAllAgents ? deps.listAllAgents() : null;
63
+ if (allAgents) {
64
+ for (const agentId of allAgents) {
65
+ if (!byAgent.has(agentId)) {
66
+ byAgent.set(agentId, []);
67
+ }
68
+ }
69
+ }
63
70
  let emitted = 0;
64
71
  let skipped = 0;
65
72
  let unchanged = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-auto-state.js","sourceRoot":"","sources":["../src/canvas-auto-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canvas-auto-state.js","sourceRoot":"","sources":["../src/canvas-auto-state.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAA;AAm8D9D,wBAAsB,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,CAw/gB7D"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAA;AAm8D9D,wBAAsB,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,CA0ghB7D"}
package/dist/server.js CHANGED
@@ -9775,6 +9775,16 @@ export async function createServer() {
9775
9775
  try {
9776
9776
  runCanvasAutoStateSweep({
9777
9777
  listTasks: (opts) => taskManager.listTasks(opts),
9778
+ listAllAgents: () => {
9779
+ // Get ALL agent IDs from task board - every assignee, even those without tasks
9780
+ const allTasks = taskManager.listTasks({});
9781
+ const agents = new Set();
9782
+ for (const t of allTasks) {
9783
+ if (t.assignee)
9784
+ agents.add(t.assignee);
9785
+ }
9786
+ return [...agents];
9787
+ },
9778
9788
  getCanvasState: (agentId) => {
9779
9789
  const entry = canvasStateMap.get(agentId);
9780
9790
  return entry ? { state: entry.state, updatedAt: entry.updatedAt } : null;
@@ -9833,21 +9843,8 @@ export async function createServer() {
9833
9843
  },
9834
9844
  emitAmbientThought: (agentId, task) => {
9835
9845
  const now = Date.now();
9836
- // Emit ambient thought - makes /live feel alive with constant activity
9837
- // Varied messages to show agents are actively working
9838
- const messages = [
9839
- `Working on: ${task.title.slice(0, 50)}`,
9840
- `Analyzing: ${task.title.slice(0, 40)}`,
9841
- `Processing: ${task.title.slice(0, 40)}`,
9842
- `Building: ${task.title.slice(0, 40)}`,
9843
- `Reviewing: ${task.title.slice(0, 40)}`,
9844
- `Testing: ${task.title.slice(0, 40)}`,
9845
- `Debugging: ${task.title.slice(0, 40)}`,
9846
- `Ship it`,
9847
- `Almost done`,
9848
- `Making progress`,
9849
- ];
9850
- const msg = messages[Math.floor(Math.random() * messages.length)];
9846
+ // Emit ambient thought with actual task title - makes /live feel alive with real work
9847
+ // Shows visitors exactly what each agent is doing right now
9851
9848
  eventBus.emit({
9852
9849
  id: `ambient-${agentId}-${now}`,
9853
9850
  type: 'canvas_push',
@@ -9857,10 +9854,10 @@ export async function createServer() {
9857
9854
  expression: 'thought',
9858
9855
  agentId,
9859
9856
  agentColor: AGENT_IDENTITY_COLORS[agentId] ?? '#60a5fa',
9860
- text: msg,
9857
+ text: task.title.slice(0, 80),
9861
9858
  state: 'working',
9862
9859
  task: task.title,
9863
- ttl: 8000,
9860
+ ttl: 12000,
9864
9861
  },
9865
9862
  });
9866
9863
  },
@@ -10630,9 +10627,31 @@ export async function createServer() {
10630
10627
  'Connection': 'keep-alive',
10631
10628
  'X-Accel-Buffering': 'no',
10632
10629
  });
10633
- // Send current state as initial snapshot
10630
+ // Derive agents from task board — show ALL agents, not just canvas-state emitters
10631
+ const allTasks = taskManager.listTasks({});
10632
+ const agentStates = {};
10633
+ for (const task of allTasks) {
10634
+ const assignee = task.assignee;
10635
+ if (!assignee || assignee === 'unassigned')
10636
+ continue;
10637
+ const agentId = assignee.toLowerCase();
10638
+ if (!agentStates[agentId]) {
10639
+ // Get canvas state if exists, otherwise default based on task status
10640
+ const canvasEntry = canvasStateMap.get(agentId);
10641
+ const isDone = task.status === 'done' || task.status === 'cancelled';
10642
+ const isBlocked = task.status === 'blocked';
10643
+ const isWorking = task.status === 'doing';
10644
+ agentStates[agentId] = {
10645
+ state: canvasEntry?.state || (isDone ? 'ambient' : isBlocked ? 'attention' : isWorking ? 'working' : 'floor'),
10646
+ currentTask: task.title,
10647
+ updatedAt: task.updatedAt || Date.now(),
10648
+ sourceTasks: [{ id: task.id, title: task.title, status: task.status }],
10649
+ };
10650
+ }
10651
+ }
10652
+ // Send current state as initial snapshot — include all agents from task board
10634
10653
  const activeSlots = canvasSlots.getActive();
10635
- reply.raw.write(`event: snapshot\ndata: ${JSON.stringify({ slots: activeSlots })}\n\n`);
10654
+ reply.raw.write(`event: snapshot\ndata: ${JSON.stringify({ slots: activeSlots, agents: agentStates })}\n\n`);
10636
10655
  // Subscribe to new render events
10637
10656
  const unsubscribe = subscribeCanvas((event, slot) => {
10638
10657
  try {