@triflux/remote 10.43.0 → 10.45.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 (48) hide show
  1. package/cto/hygiene.mjs +1 -1
  2. package/hub/lib/cto-env.mjs +1 -0
  3. package/hub/pipe.mjs +10 -9
  4. package/hub/schema.sql +62 -2
  5. package/hub/server.mjs +276 -132
  6. package/hub/store.mjs +699 -41
  7. package/hub/team/backend.mjs +4 -2
  8. package/hub/team/claude-daemon-control.mjs +2 -0
  9. package/hub/team/cli/commands/start/start-headless.mjs +2 -0
  10. package/hub/team/cli/commands/start/start-mux.mjs +24 -3
  11. package/hub/team/cli/services/runtime-mode.mjs +23 -9
  12. package/hub/team/conductor.mjs +101 -24
  13. package/hub/team/cto-auto-collect.mjs +2 -6
  14. package/hub/team/cto-pull.mjs +4 -0
  15. package/hub/team/dashboard-open.mjs +1 -0
  16. package/hub/team/execution-mode.mjs +50 -9
  17. package/hub/team/headless.mjs +539 -92
  18. package/hub/team/interactive-tui-transport.mjs +15 -1
  19. package/hub/team/intervention.mjs +1 -1
  20. package/hub/team/launcher-template.mjs +17 -1
  21. package/hub/team/notify.mjs +31 -11
  22. package/hub/team/orchestrator.mjs +36 -9
  23. package/hub/team/pane.mjs +176 -14
  24. package/hub/team/psmux.mjs +79 -70
  25. package/hub/team/retry-state-machine.mjs +41 -13
  26. package/hub/team/session.mjs +57 -0
  27. package/hub/team/swarm-hypervisor.mjs +4 -2
  28. package/hub/team/swarm-preflight.mjs +47 -0
  29. package/hub/team/synapse-http.mjs +149 -4
  30. package/hub/team/terminal-opener.mjs +68 -13
  31. package/hub/team/tui-viewer.mjs +65 -14
  32. package/hub/team/worktree-lifecycle.mjs +56 -59
  33. package/hub/tools.mjs +22 -1
  34. package/hub/workers/codex-mcp.mjs +26 -5
  35. package/hub/workers/delegator-mcp.mjs +3 -49
  36. package/package.json +1 -1
  37. package/scripts/lib/agent-route-policy.mjs +367 -0
  38. package/scripts/lib/cli-agy.mjs +24 -4
  39. package/scripts/lib/cli-codex.mjs +22 -160
  40. package/scripts/lib/codex-profile-config.mjs +48 -4
  41. package/scripts/lib/codex-recovery.sh +19 -0
  42. package/scripts/lib/gemini-profiles.mjs +113 -29
  43. package/scripts/lib/keyword-rules.mjs +24 -0
  44. package/scripts/lib/logger.mjs +60 -43
  45. package/scripts/lib/machine-profile.mjs +293 -0
  46. package/scripts/lib/mcp-health.mjs +44 -18
  47. package/cto/steward.mjs +0 -362
  48. package/hub/log-retention.mjs +0 -726
package/cto/hygiene.mjs CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  } from "node:fs";
12
12
  import { homedir } from "node:os";
13
13
  import { basename, dirname, join } from "node:path";
14
- import { getCtoHygieneApplyMode } from "@triflux/core/hub/lib/cto-env.mjs";
14
+ import { getCtoHygieneApplyMode } from "../hub/lib/cto-env.mjs";
15
15
  import { appendCtoEvent } from "./events.mjs";
16
16
  import { applyHygieneArchiveActions } from "./hygiene-actions.mjs";
17
17
  import { resolveLakeRootDir } from "./lake-root.mjs";
@@ -0,0 +1 @@
1
+ export * from "@triflux/core/hub/lib/cto-env.mjs";
package/hub/pipe.mjs CHANGED
@@ -267,12 +267,11 @@ export function createPipeServer({
267
267
  const result = router.refreshAgentLease(
268
268
  agentId,
269
269
  payload.heartbeat_ttl_ms || heartbeatTtlMs,
270
+ payload.presence_generation,
271
+ payload,
270
272
  );
271
273
  if (client) touchClient(client);
272
- if (result?.effective?.updated === false) {
273
- return { ok: false, error: { code: "AGENT_NOT_FOUND", message: `heartbeat target not registered: ${agentId}` } };
274
- }
275
- return { ok: true, data: result };
274
+ return result;
276
275
  }
277
276
 
278
277
  case "publish": {
@@ -351,12 +350,14 @@ export function createPipeServer({
351
350
 
352
351
  case "deregister": {
353
352
  const agentId = resolveAgentId(client, payload);
354
- router.updateAgentStatus(agentId, "offline");
353
+ const result = router.transitionAgentStatus(
354
+ agentId,
355
+ "offline",
356
+ payload.presence_generation,
357
+ payload,
358
+ );
355
359
  if (client) touchClient(client);
356
- return {
357
- ok: true,
358
- data: { agent_id: agentId, status: "offline" },
359
- };
360
+ return result;
360
361
  }
361
362
 
362
363
  case "send_input": {
package/hub/schema.sql CHANGED
@@ -10,8 +10,13 @@ CREATE TABLE IF NOT EXISTS agents (
10
10
  topics_json TEXT NOT NULL DEFAULT '[]',
11
11
  last_seen_ms INTEGER NOT NULL,
12
12
  lease_expires_ms INTEGER NOT NULL,
13
+ presence_generation INTEGER NOT NULL DEFAULT 0,
13
14
  status TEXT NOT NULL CHECK (status IN ('online','stale','offline')),
14
- metadata_json TEXT NOT NULL DEFAULT '{}'
15
+ metadata_json TEXT NOT NULL DEFAULT '{}',
16
+ project_id TEXT,
17
+ session_id TEXT,
18
+ host_id TEXT,
19
+ transport_locators_json TEXT NOT NULL DEFAULT '[]'
15
20
  );
16
21
 
17
22
  -- 메시지 테이블
@@ -28,7 +33,61 @@ CREATE TABLE IF NOT EXISTS messages (
28
33
  correlation_id TEXT NOT NULL,
29
34
  trace_id TEXT NOT NULL,
30
35
  payload_json TEXT NOT NULL DEFAULT '{}',
31
- status TEXT NOT NULL CHECK (status IN ('queued','delivered','acked','expired','dead_letter'))
36
+ status TEXT NOT NULL CHECK (status IN ('queued','delivered','acked','expired','dead_letter')),
37
+ role_key_wire TEXT
38
+ );
39
+
40
+ -- 동적 역할 레지스트리 (schema v6)
41
+ CREATE TABLE IF NOT EXISTS role_registry (
42
+ role_key_wire TEXT PRIMARY KEY,
43
+ project_id TEXT NOT NULL,
44
+ role_kind TEXT NOT NULL CHECK (role_kind IN ('cto','lead')),
45
+ scope_id TEXT NOT NULL DEFAULT '',
46
+ state TEXT NOT NULL CHECK (
47
+ state IN (
48
+ 'electable',
49
+ 'elected-probing',
50
+ 'active',
51
+ 'unreachable',
52
+ 'quarantined'
53
+ )
54
+ ),
55
+ holder_agent_id TEXT,
56
+ previous_holder_agent_id TEXT,
57
+ epoch INTEGER NOT NULL DEFAULT 0 CHECK (epoch >= 0),
58
+ activation_seq INTEGER NOT NULL DEFAULT 0 CHECK (activation_seq >= 0),
59
+ activation_id TEXT,
60
+ activation_deadline_ms INTEGER,
61
+ holder_lease_expires_ms INTEGER,
62
+ charter_version TEXT,
63
+ charter_acked_epoch INTEGER,
64
+ retry_count INTEGER NOT NULL DEFAULT 0,
65
+ next_probe_ms INTEGER,
66
+ blocked_reason TEXT,
67
+ last_transition_ms INTEGER NOT NULL,
68
+ last_reason TEXT NOT NULL,
69
+ version INTEGER NOT NULL DEFAULT 0,
70
+ CHECK (
71
+ (role_kind = 'cto' AND scope_id = '') OR
72
+ (role_kind = 'lead' AND scope_id <> '')
73
+ ),
74
+ UNIQUE(project_id, role_kind, scope_id)
75
+ );
76
+
77
+ CREATE TABLE IF NOT EXISTS role_candidates (
78
+ role_key_wire TEXT NOT NULL,
79
+ agent_id TEXT NOT NULL,
80
+ source TEXT NOT NULL CHECK (source IN ('grant','standup','operator')),
81
+ priority INTEGER NOT NULL DEFAULT 0,
82
+ transport_locators_json TEXT NOT NULL DEFAULT '[]',
83
+ consecutive_probe_failures INTEGER NOT NULL DEFAULT 0,
84
+ excluded_until_ms INTEGER,
85
+ last_probe_ms INTEGER,
86
+ last_probe_code TEXT,
87
+ updated_at_ms INTEGER NOT NULL,
88
+ PRIMARY KEY(role_key_wire, agent_id),
89
+ FOREIGN KEY(role_key_wire)
90
+ REFERENCES role_registry(role_key_wire) ON DELETE CASCADE
32
91
  );
33
92
 
34
93
  -- 메시지 수신함 (배달 추적)
@@ -73,6 +132,7 @@ CREATE INDEX IF NOT EXISTS idx_messages_correlation ON messages(correlation_id);
73
132
  CREATE INDEX IF NOT EXISTS idx_messages_trace ON messages(trace_id);
74
133
  CREATE INDEX IF NOT EXISTS idx_messages_expires ON messages(expires_at_ms);
75
134
  CREATE INDEX IF NOT EXISTS idx_messages_priority ON messages(priority DESC, created_at_ms ASC);
135
+ CREATE INDEX IF NOT EXISTS idx_messages_role_key ON messages(role_key_wire, status, expires_at_ms);
76
136
  CREATE INDEX IF NOT EXISTS idx_inbox_agent ON message_inbox(agent_id, delivered_at_ms);
77
137
  CREATE INDEX IF NOT EXISTS idx_inbox_message ON message_inbox(message_id);
78
138
  CREATE INDEX IF NOT EXISTS idx_human_requests_state ON human_requests(state);