@staix/agent-hub 0.34.0 → 0.35.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 (161) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/README.md +35 -6
  3. package/docs/adding-an-ai-tool.md +2 -2
  4. package/docs/addons/claude-mem.md +4 -4
  5. package/docs/addons/open-code-review.md +1 -1
  6. package/docs/agent-notes/README.md +6 -0
  7. package/docs/agent-notes/adapters.md +9 -5
  8. package/docs/agent-notes/budget.md +1 -1
  9. package/docs/agent-notes/bus.md +1 -1
  10. package/docs/agent-notes/daemon.md +4 -3
  11. package/docs/agent-notes/local-worker.md +1 -1
  12. package/docs/agent-notes/models.md +2 -0
  13. package/docs/agent-notes/tasks.md +1 -1
  14. package/docs/agent-notes/tests.md +5 -0
  15. package/docs/design/adapters.md +110 -2
  16. package/docs/design/agent-hub-architecture.md +63 -1
  17. package/docs/design/agent-hub.md +6 -0
  18. package/docs/design/bus.md +18 -0
  19. package/docs/design/execution-reference.md +146 -0
  20. package/docs/design/task-board.md +10 -0
  21. package/docs/dogfood.md +33 -12
  22. package/docs/events.md +38 -20
  23. package/docs/memory.md +21 -7
  24. package/docs/operations.md +539 -24
  25. package/docs/quickstart.md +18 -4
  26. package/docs/research.md +71 -13
  27. package/docs/roles.md +1 -1
  28. package/docs/sdlc.md +9 -7
  29. package/docs/security.md +87 -11
  30. package/docs/smoke.md +14 -0
  31. package/docs/specs/2026-09-19-agent-hub-design.md +8 -3
  32. package/docs/verification/2026-11-07-0.34.1.md +54 -0
  33. package/docs/verification/2026-11-07-compat-python-startup-1248.md +51 -0
  34. package/docs/verification/2026-11-07-compat-receipt-harness-1248.md +105 -0
  35. package/docs/verification/2026-11-07-compat-receipt-producers-1248.md +96 -0
  36. package/docs/verification/2026-11-07-compat-workflow-1248.md +94 -0
  37. package/docs/verification/2026-11-07-daemon-startup-1232.md +169 -0
  38. package/docs/verification/2026-11-07-jcode-receipt-reconstruction-1248.md +118 -0
  39. package/docs/verification/2026-11-07-kimi-delayed-usage.md +34 -0
  40. package/docs/verification/2026-11-07-kimi-review-watch-1284.md +115 -0
  41. package/docs/verification/2026-11-08-agy-1.5.3.md +96 -0
  42. package/docs/verification/2026-11-08-agy-acp-t0.md +56 -0
  43. package/docs/verification/2026-11-08-hub-visual-1058.md +161 -0
  44. package/docs/verification/2026-11-08-jcode-0991-model-setter-1317.md +143 -0
  45. package/docs/verification/2026-11-08-kimi-252-model-setter-1317.md +137 -0
  46. package/docs/verification/2026-11-08-kimi-tui-completion-1282.md +45 -0
  47. package/docs/verification/2026-11-08-kimi-wire-yield-1283.md +31 -0
  48. package/docs/verification/2026-11-08-live-model-override-1317.md +250 -0
  49. package/docs/verification/2026-11-08-qwen-0269-acp.md +138 -0
  50. package/docs/verification/2026-11-08-qwen-0269-model-setter-1317.md +91 -0
  51. package/docs/verification/2026-11-09-0.35.0.md +129 -0
  52. package/docs/verification/2026-11-09-headless-records-1320.md +157 -0
  53. package/docs/verification/claude-permission-transport-native.py +10 -3
  54. package/docs/verification/claude-shell-wrapper-native.py +8 -8
  55. package/docs/verified.json +245 -15
  56. package/package.json +3 -3
  57. package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
  58. package/plugins/agent-hub/kimi-hook.js +20397 -0
  59. package/plugins/agent-hub/kimi-review-policy-worker.js +217 -0
  60. package/plugins/agent-hub/server.js +2701 -664
  61. package/scripts/check-docs.mjs +12 -1
  62. package/src/adapters/acp-model-policy.ts +56 -0
  63. package/src/adapters/acp.ts +175 -5
  64. package/src/adapters/agy/entry.ts +8 -5
  65. package/src/adapters/agy/hooks.ts +65 -15
  66. package/src/adapters/channel-peer.ts +33 -1
  67. package/src/adapters/claude-implementer.ts +16 -3
  68. package/src/adapters/codex-appserver.ts +118 -8
  69. package/src/adapters/codex-review-isolation.ts +3 -1
  70. package/src/adapters/compat.ts +11 -6
  71. package/src/adapters/definitions/builtin-metadata.ts +8 -1
  72. package/src/adapters/definitions/native-cli-entry-kimi.ts +76 -7
  73. package/src/adapters/definitions/native-cli-preview-common.ts +2 -2
  74. package/src/adapters/definitions/native-cli-preview-kimi.ts +9 -2
  75. package/src/adapters/definitions/reviewer-variants.ts +3 -1
  76. package/src/adapters/kimi-review-policy-worker.js +2 -0
  77. package/src/adapters/kimi-review-policy-worker.ts +85 -0
  78. package/src/adapters/kimi-review-policy.ts +68 -0
  79. package/src/adapters/kimi-review.ts +41 -41
  80. package/src/adapters/kimi-tui-facts.ts +153 -0
  81. package/src/adapters/kimi-wire-usage.ts +33 -8
  82. package/src/adapters/local-worker.ts +59 -20
  83. package/src/adapters/model-token.ts +3 -0
  84. package/src/adapters/pi.ts +27 -5
  85. package/src/adapters/registry-types.ts +34 -3
  86. package/src/adapters/registry.ts +1 -0
  87. package/src/adapters/reviewer-policy-watch.ts +86 -0
  88. package/src/adapters/reviewer-print.ts +80 -18
  89. package/src/cli/agents.ts +1 -1
  90. package/src/cli/facts-hook.ts +4 -2
  91. package/src/cli/help.ts +3 -2
  92. package/src/cli/identity.ts +3 -0
  93. package/src/cli/kimi-facts-hook.ts +11 -0
  94. package/src/cli/kimi-plugin.ts +157 -0
  95. package/src/cli/main.ts +48 -9
  96. package/src/cli/model.ts +52 -0
  97. package/src/cli/output.ts +23 -1
  98. package/src/cli/recovery-package.ts +15 -7
  99. package/src/cli/reset.ts +1 -1
  100. package/src/cli/status-lines.ts +8 -4
  101. package/src/hub/budget.ts +1 -1
  102. package/src/hub/bus.ts +40 -2
  103. package/src/hub/code-facts.ts +10 -3
  104. package/src/hub/completions.ts +3 -1
  105. package/src/hub/config-apply.ts +2 -1
  106. package/src/hub/control-client.ts +1 -1
  107. package/src/hub/daemon.ts +1050 -106
  108. package/src/hub/deliverable-files.ts +38 -5
  109. package/src/hub/dogfood-profile.ts +1 -1
  110. package/src/hub/envelope.ts +1 -1
  111. package/src/hub/events.ts +28 -18
  112. package/src/hub/execution-lineage.ts +120 -0
  113. package/src/hub/execution-reference.ts +36 -0
  114. package/src/hub/hub-tools.ts +21 -2
  115. package/src/hub/instances.ts +4 -3
  116. package/src/hub/kimi-events.ts +46 -0
  117. package/src/hub/kimi-usage.ts +132 -29
  118. package/src/hub/lifecycle.ts +31 -15
  119. package/src/hub/limits.ts +13 -4
  120. package/src/hub/manager.ts +15 -2
  121. package/src/hub/memory-policy.ts +2 -1
  122. package/src/hub/memory-sync-attestation.ts +54 -0
  123. package/src/hub/memory-sync-state.ts +20 -5
  124. package/src/hub/model-overrides.ts +115 -0
  125. package/src/hub/native-hook-launch.ts +12 -3
  126. package/src/hub/operational-view.ts +2 -2
  127. package/src/hub/peers.ts +27 -0
  128. package/src/hub/permission-mode.ts +1 -1
  129. package/src/hub/person-figures.ts +88 -0
  130. package/src/hub/report.ts +38 -4
  131. package/src/hub/research-dataset.ts +158 -0
  132. package/src/hub/research-memory.ts +68 -0
  133. package/src/hub/research-quality.ts +118 -0
  134. package/src/hub/research-record.ts +279 -0
  135. package/src/hub/research.ts +126 -27
  136. package/src/hub/restart.ts +14 -0
  137. package/src/hub/settings.ts +3 -0
  138. package/src/hub/startup-event-seeds.ts +51 -0
  139. package/src/hub/startup-readiness.ts +65 -0
  140. package/src/hub/startup-timing.ts +38 -0
  141. package/src/hub/tasks.ts +29 -9
  142. package/src/hub/ui.ts +9 -5
  143. package/src/hub/visual-assets.ts +50 -0
  144. package/src/hub/visual.ts +257 -0
  145. package/src/memory/brief.ts +169 -14
  146. package/src/memory/capture.ts +2 -1
  147. package/src/memory/recall.ts +46 -5
  148. package/src/memory/record-provenance.ts +82 -0
  149. package/src/memory/records.ts +116 -0
  150. package/src/models/route/adec.ts +190 -0
  151. package/src/models/route/config.ts +37 -3
  152. package/src/models/route/decision-evidence.ts +83 -0
  153. package/src/models/route/decision.ts +143 -0
  154. package/src/models/route/runtime.ts +13 -6
  155. package/src/ui/index.html +134 -6
  156. package/src/ui/plugin.ts +65 -4
  157. package/templates/AGENTS.block.md +1 -1
  158. package/templates/config.json +1 -1
  159. package/templates/profiles/general.json +1 -1
  160. package/templates/profiles/research.json +1 -1
  161. package/templates/profiles/writing.json +1 -1
@@ -1,7 +1,7 @@
1
1
  # Model-free native receipt. Usage: python3 this.py OUTPUT --bun /absolute/bun --claude /absolute/claude [--claude ...]
2
2
  import argparse, hashlib, http.server, json, os, pathlib, select, shlex, signal, subprocess, sys, threading
3
- parser=argparse.ArgumentParser(); parser.add_argument('output'); parser.add_argument('--bun',required=True); parser.add_argument('--claude',action='append',required=True)
4
- args=parser.parse_args(); ROOT=pathlib.Path(args.output).resolve(); ROOT.mkdir(mode=0o700,parents=False,exist_ok=False)
3
+ parser=argparse.ArgumentParser(); parser.add_argument('output'); parser.add_argument('--bun',required=True); parser.add_argument('--claude',action='append',required=True); parser.add_argument('--runtime-path',help='Explicit isolated runtime PATH; omitted preserves original native and host paths'); parser.add_argument('--expected-version',help='Require an exact candidate version; omitted retains the original version controls')
4
+ args=parser.parse_args(); runtime_path=args.runtime_path if args.runtime_path is not None else '/usr/bin:/bin'; host_path=args.runtime_path if args.runtime_path is not None else '/opt/homebrew/bin:/usr/bin:/bin'; ROOT=pathlib.Path(args.output).resolve(); ROOT.mkdir(mode=0o700,parents=False,exist_ok=False)
5
5
  HOST=pathlib.Path(__file__).with_name('claude-shell-wrapper-host.ts').resolve()
6
6
  MCP="import sys,json,os,time\nfor line in sys.stdin:\n try: q=json.loads(line)\n except: continue\n method=q.get('method'); rid=q.get('id')\n if rid is None: continue\n if method=='initialize': r={'protocolVersion':'2024-11-05','capabilities':{'tools':{}},'serverInfo':{'name':'fixture','version':'1'}}\n elif method=='tools/list': r={'tools':[{'name':'approve','description':'Person approval fixture','inputSchema':{'type':'object','properties':{'tool_name':{'type':'string'},'input':{'type':'object'},'tool_use_id':{'type':'string'}},'required':['tool_name','input','tool_use_id'],'additionalProperties':False}}]}\n elif method=='tools/call':\n mode=os.environ['CASE']; args=q.get('params',{}).get('arguments',{})\n if mode=='timeout': time.sleep(60)\n if mode=='approval-timeout': time.sleep(.1)\n if mode=='disconnect': sys.exit(1)\n if mode=='tool-error':\n print(json.dumps({'jsonrpc':'2.0','id':rid,'error':{'code':-32000,'message':'fixture hub unavailable'}}),flush=True); continue\n if mode in ('deny','hook-failure','approval-timeout'): value={'behavior':'deny','message':'no person answered' if mode=='approval-timeout' else 'fixture denied'}\n else:\n updated=args.get('input',{})\n if mode=='normalized' and updated.get('description') in ('probe1','probe2'): updated={'command':os.environ['NORMALIZED'],'description':'host-bound fixture'}\n value={'behavior':'allow','updatedInput':updated}\n with open(os.environ['RECEIPT'],'a') as f: print(json.dumps({'arguments':args,'response':value}),file=f)\n r={'content':[{'type':'text','text':json.dumps(value)}]}\n else: r={}\n print(json.dumps({'jsonrpc':'2.0','id':rid,'result':r}),flush=True)\n"
7
7
  (ROOT/'mcp.py').write_text(MCP)
@@ -45,7 +45,7 @@ def stop(process):
45
45
  try: os.killpg(process.pid,signal.SIGKILL)
46
46
  except ProcessLookupError: pass
47
47
  process.wait(timeout=5)
48
- return process.returncode==0
48
+ return process.returncode==0 and empty_group(process.pid)
49
49
  except (OSError,subprocess.TimeoutExpired):return False
50
50
 
51
51
  def empty_group(pid):
@@ -67,8 +67,8 @@ def sha(file):
67
67
  results=[]
68
68
  for raw_binary in args.claude:
69
69
  binary=pathlib.Path(raw_binary).resolve(); identity=ROOT/('identity-'+binary.name); identity.mkdir()
70
- version=subprocess.run([str(binary),'--version'],env={'HOME':str(identity),'CLAUDE_CONFIG_DIR':str(identity/'config'),'PATH':'/usr/bin:/bin'},capture_output=True,text=True,timeout=10)
71
- assert version.returncode==0 and version.stdout.strip().split()[0] in ('2.1.309','2.1.310','2.1.314','2.1.316','2.1.318','2.1.319'),(version.returncode,version.stdout)
70
+ version=subprocess.run([str(binary),'--version'],env={'HOME':str(identity),'CLAUDE_CONFIG_DIR':str(identity/'config'),'PATH':runtime_path},capture_output=True,text=True,timeout=10)
71
+ assert version.returncode==0 and (version.stdout.strip().split()[0] == args.expected_version if args.expected_version is not None else version.stdout.strip().split()[0] in ('2.1.309','2.1.310','2.1.314','2.1.316','2.1.318','2.1.319')),(version.returncode,version.stdout)
72
72
  label=version.stdout.strip().split()[0]; digest=sha(binary)
73
73
  for mode in ('context','normalized'):
74
74
  d=ROOT/(label+'-'+mode); d.mkdir(); home=d/'home';home.mkdir(); work=d/"work 'quoted'";work.mkdir();(work/'sub').mkdir()
@@ -81,7 +81,7 @@ for raw_binary in args.claude:
81
81
  rewritten=''
82
82
  if mode=='normalized':
83
83
  fixture=d/'host.json';fixture.write_text(json.dumps({'root':str(work),'executable':str(executable)}))
84
- helper=subprocess.Popen([str(pathlib.Path(args.bun).resolve()),str(HOST),str(fixture)],env={'HOME':str(home),'PATH':'/opt/homebrew/bin:/usr/bin:/bin','LANG':'C','TERM':'dumb'},stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=open(d/'host.stderr','w'),text=True,start_new_session=True)
84
+ helper=subprocess.Popen([str(pathlib.Path(args.bun).resolve()),str(HOST),str(fixture)],env={'HOME':str(home),'PATH':host_path,'LANG':'C','TERM':'dumb'},stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=open(d/'host.stderr','w'),text=True,start_new_session=True)
85
85
  assert select.select([helper.stdout],[],[],10)[0],'host fixture handshake timeout'
86
86
  reply=json.loads(helper.stdout.readline());rewritten=reply['command'];assert isinstance(rewritten,str) and rewritten
87
87
  commands=['cd sub && pwd','pwd']+(['pwd'] if mode=='normalized' else [])
@@ -89,7 +89,7 @@ for raw_binary in args.claude:
89
89
  threading.Thread(target=srv.serve_forever,daemon=True).start()
90
90
  config={'mcpServers':{'fixture':{'command':'/usr/bin/python3','args':[str(ROOT/'mcp.py')],'env':{'CASE':mode,'RECEIPT':str(d/'mcp.jsonl'),'NORMALIZED':rewritten}}}}
91
91
  (d/'mcp.json').write_text(json.dumps(config));(d/'settings.json').write_text(json.dumps({'permissions':{'ask':['Bash']}}))
92
- native_env={'HOME':str(home),'CLAUDE_CONFIG_DIR':str(home/'config'),'PATH':'/usr/bin:/bin','ANTHROPIC_BASE_URL':'http://127.0.0.1:'+str(srv.server_port),'ANTHROPIC_API_KEY':'synthetic-probe-not-a-credential','CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC':'1','DISABLE_AUTOUPDATER':'1','GIT_DIR':str(d/'poison-git'),'RIPGREP_CONFIG_PATH':str(d/'poison-rg')}
92
+ native_env={'HOME':str(home),'CLAUDE_CONFIG_DIR':str(home/'config'),'PATH':runtime_path,'ANTHROPIC_BASE_URL':'http://127.0.0.1:'+str(srv.server_port),'ANTHROPIC_API_KEY':'synthetic-probe-not-a-credential','CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC':'1','DISABLE_AUTOUPDATER':'1','GIT_DIR':str(d/'poison-git'),'RIPGREP_CONFIG_PATH':str(d/'poison-rg')}
93
93
  argv=[str(binary),'-p','--output-format','stream-json','--verbose','--strict-mcp-config','--mcp-config',str(d/'mcp.json'),'--setting-sources','','--settings',str(d/'settings.json'),'--permission-mode','default','--permission-prompts','host','--permission-prompt-tool','mcp__fixture__approve','--model','claude-sonnet-4-5','Run the fixture commands.']
94
94
  native=subprocess.Popen(argv,cwd=work,env=native_env,stdout=open(d/'stdout','w'),stderr=open(d/'stderr','w'),start_new_session=True)
95
95
  native.wait(timeout=25);assert native.returncode==0,(native.returncode,(d/'stderr').read_text())
@@ -115,7 +115,7 @@ for raw_binary in args.claude:
115
115
  else:
116
116
  observed=json.loads(output(1));assert observed['marker']=='HOST_EXECUTABLE' and observed['cwd']==str(work) and observed['executable']==str(executable.resolve()),observed
117
117
  assert observed['nativeVars']=={'GIT_DIR':None,'RIPGREP_CONFIG_PATH':None},observed
118
- assert observed['peer']=='claude-fixture' and observed['term']=='dumb' and observed['home']==str(home) and observed['path']=='/opt/homebrew/bin:/usr/bin:/bin',observed
118
+ assert observed['peer']=='claude-fixture' and observed['term']=='dumb' and observed['home']==str(home) and observed['path']==host_path,observed
119
119
  assert observed['tmpdir'] and 'ahub-shell-' in observed['tmpdir'] and str(d) not in observed['tmpdir'],observed
120
120
  replay_tool,replay=frames['toolu_probe_2'];assert replay.get('is_error') is True and 'host shell execution refused' in json.dumps(replay_tool),frames['toolu_probe_2']
121
121
  assert counter.read_text()=='1',counter.read_text()
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": 1,
3
3
  "documents": {
4
4
  "README.md": {
5
- "verifiedAgainst": "d31d7503fce542f37ed9cdacb3c40fc86786cb09",
5
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
6
6
  "paths": [
7
7
  "package.json",
8
8
  "src/",
@@ -11,14 +11,14 @@
11
11
  ]
12
12
  },
13
13
  "docs/security.md": {
14
- "verifiedAgainst": "d31d7503fce542f37ed9cdacb3c40fc86786cb09",
14
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
15
15
  "paths": [
16
16
  "src/",
17
17
  "templates/"
18
18
  ]
19
19
  },
20
20
  "docs/operations.md": {
21
- "verifiedAgainst": "d31d7503fce542f37ed9cdacb3c40fc86786cb09",
21
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
22
22
  "paths": [
23
23
  "package.json",
24
24
  "src/",
@@ -35,15 +35,245 @@
35
35
  ]
36
36
  },
37
37
  "docs/quickstart.md": {
38
- "verifiedAgainst": "d31d7503fce542f37ed9cdacb3c40fc86786cb09",
38
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
39
39
  "paths": [
40
40
  "package.json",
41
41
  "src/",
42
42
  "templates/"
43
43
  ]
44
44
  },
45
+ "docs/adding-an-ai-tool.md": {
46
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
47
+ "paths": [
48
+ "src/adapters/registry-types.ts",
49
+ "src/adapters/registry.ts",
50
+ "src/adapters/public.ts",
51
+ "src/adapters/adapter-api.ts",
52
+ "src/adapters/external-modules.ts",
53
+ "src/adapters/external-module-scan.ts",
54
+ "src/adapters/configured-acp.ts",
55
+ "src/adapters/conformance/",
56
+ "test/conformance/",
57
+ "src/hub/permission-mode.ts",
58
+ "src/hub/peer-catalog.ts",
59
+ "src/hub/start-mode.ts",
60
+ "src/hub/peers.ts",
61
+ "package.json"
62
+ ]
63
+ },
64
+ "docs/addons/claude-mem.md": {
65
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
66
+ "paths": [
67
+ "src/hub/tooling.ts",
68
+ "src/adapters/definitions/native-policy-aux.ts",
69
+ "src/adapters/definitions/native-cli-doctor.ts",
70
+ "src/memory/",
71
+ "src/hub/bench.ts",
72
+ "src/cli/bench.ts",
73
+ "src/hub/research.ts",
74
+ "package.json"
75
+ ]
76
+ },
77
+ "docs/addons/codex-plugin.md": {
78
+ "verifiedAgainst": "8e066f20c2809b7700539cd7dd42ef4232f44eae",
79
+ "paths": [
80
+ "src/hub/tooling.ts",
81
+ "src/adapters/definitions/native-policy-aux.ts"
82
+ ]
83
+ },
84
+ "docs/addons/dot-admit.md": {
85
+ "verifiedAgainst": "8e066f20c2809b7700539cd7dd42ef4232f44eae",
86
+ "paths": [
87
+ "src/hub/tooling.ts"
88
+ ]
89
+ },
90
+ "docs/addons/open-code-review.md": {
91
+ "verifiedAgainst": "8e066f20c2809b7700539cd7dd42ef4232f44eae",
92
+ "paths": [
93
+ "src/hub/tooling.ts",
94
+ "src/adapters/definitions/native-policy-aux.ts"
95
+ ]
96
+ },
97
+ "docs/addons/ponytail.md": {
98
+ "verifiedAgainst": "8e066f20c2809b7700539cd7dd42ef4232f44eae",
99
+ "paths": [
100
+ "src/hub/tooling.ts",
101
+ "src/adapters/definitions/native-policy-aux.ts"
102
+ ]
103
+ },
104
+ "docs/addons/ripwire.md": {
105
+ "verifiedAgainst": "8e066f20c2809b7700539cd7dd42ef4232f44eae",
106
+ "paths": [
107
+ "src/hub/tooling.ts"
108
+ ]
109
+ },
110
+ "docs/bench.md": {
111
+ "verifiedAgainst": "8e066f20c2809b7700539cd7dd42ef4232f44eae",
112
+ "paths": [
113
+ "src/hub/bench.ts",
114
+ "src/cli/bench.ts",
115
+ "src/hub/tooling.ts"
116
+ ]
117
+ },
118
+ "docs/cooperbench.md": {
119
+ "verifiedAgainst": "8e066f20c2809b7700539cd7dd42ef4232f44eae",
120
+ "paths": [
121
+ "scripts/benchmarks/runner.py",
122
+ "scripts/benchmarks/native.ts",
123
+ "scripts/benchmarks/native-pi-qwen.ts",
124
+ "scripts/benchmarks/restore.ts",
125
+ "scripts/benchmarks/teardown.ts",
126
+ "scripts/benchmarks/ledger.py",
127
+ "scripts/benchmarks/evaluate.py",
128
+ "scripts/benchmarks/peer-bus-mcp.py",
129
+ "scripts/benchmarks/study_supervisor.py",
130
+ "scripts/benchmarks/study_audit.py",
131
+ "scripts/benchmarks/probe-qwen-usage.ts",
132
+ "scripts/benchmarks/orca-workspace.ts",
133
+ "scripts/benchmarks/manifest-v1.json",
134
+ "scripts/benchmarks/manifest-v2.json",
135
+ "scripts/benchmarks/manifest-v2-ablation-106.json",
136
+ "scripts/benchmarks/manifest-v3-pi-qwen.json",
137
+ "scripts/benchmarks/manifest-v3-pi-qwen-tools-v2.json",
138
+ "src/cli/statusline-tee.ts",
139
+ "src/hub/child-process.ts",
140
+ "src/models/relay.ts"
141
+ ]
142
+ },
143
+ "docs/data-policy.md": {
144
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
145
+ "paths": [
146
+ "src/hub/path-policy.ts",
147
+ "src/local/tools.ts",
148
+ "src/local/sandbox.ts",
149
+ "src/local/doc-read.ts",
150
+ "src/local/web-fetch.ts",
151
+ "src/local/web-fetch-config.ts",
152
+ "src/hub/config-trust.ts",
153
+ "src/hub/config-apply.ts"
154
+ ]
155
+ },
156
+ "docs/dogfood.md": {
157
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
158
+ "paths": [
159
+ "src/hub/dogfood.ts",
160
+ "src/hub/dogfood-read.ts",
161
+ "src/hub/dogfood-profile.ts",
162
+ "src/cli/main.ts",
163
+ "src/cli/help.ts"
164
+ ]
165
+ },
166
+ "docs/events.md": {
167
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
168
+ "paths": [
169
+ "src/hub/events.ts",
170
+ "src/hub/attribution.ts",
171
+ "src/hub/usage-rollup.ts",
172
+ "src/hub/report.ts",
173
+ "src/hub/budget.ts",
174
+ "src/hub/settings.ts",
175
+ "src/adapters/kimi-wire-usage.ts",
176
+ "src/adapters/compat.ts"
177
+ ]
178
+ },
179
+ "docs/memory.md": {
180
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
181
+ "paths": [
182
+ "package.json",
183
+ "src/memory/",
184
+ "src/cli/memory.ts",
185
+ "src/cli/identity.ts",
186
+ "src/hub/memory-*.ts",
187
+ "src/hub/read-tools.ts",
188
+ "src/hub/corpus*.ts",
189
+ "src/hub/code-facts.ts",
190
+ "src/hub/symbol-normalizer.ts",
191
+ "src/hub/bench.ts",
192
+ "src/hub/events.ts",
193
+ "test/hub-home.ts"
194
+ ]
195
+ },
196
+ "docs/profiles.md": {
197
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
198
+ "paths": [
199
+ "templates/profiles/",
200
+ "templates/packs/",
201
+ "templates/checks/",
202
+ "src/hub/profiles.ts",
203
+ "src/hub/packs.ts",
204
+ "src/hub/shipped-packs.ts",
205
+ "src/hub/research-evidence.ts",
206
+ "src/hub/research-campaign.ts",
207
+ "src/hub/research-experiments.ts",
208
+ "src/hub/dogfood-profile.ts",
209
+ "src/hub/learning.ts",
210
+ "src/cli/study.ts",
211
+ "src/cli/init.ts",
212
+ "scripts/check-citations.ts"
213
+ ]
214
+ },
215
+ "docs/research.md": {
216
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
217
+ "paths": [
218
+ "src/hub/research.ts",
219
+ "src/hub/tooling.ts",
220
+ "src/hub/config-apply.ts"
221
+ ]
222
+ },
223
+ "docs/roles.md": {
224
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
225
+ "paths": [
226
+ "src/hub/roles.ts",
227
+ "src/hub/shipped-roles.ts",
228
+ "templates/roles/",
229
+ "src/hub/settings.ts",
230
+ "scripts/check-roles.ts",
231
+ "scripts/build.mjs"
232
+ ]
233
+ },
234
+ "docs/sdlc.md": {
235
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
236
+ "paths": [
237
+ "src/hub/sdlc.ts",
238
+ "src/hub/sdlc-merge.ts",
239
+ "src/hub/sdlc-mirror.ts",
240
+ "src/hub/sdlc-queue.ts",
241
+ "src/hub/sdlc-release.ts",
242
+ "src/hub/sdlc-release-authorization.ts",
243
+ "src/hub/sdlc-metrics.ts",
244
+ "src/hub/security-baseline.ts",
245
+ "src/hub/eval-gate.ts",
246
+ "src/hub/workflow.ts",
247
+ "src/hub/review-findings.ts",
248
+ "src/hub/plan-conformance.ts",
249
+ "src/hub/test-integrity.ts",
250
+ "src/hub/deliverables.ts",
251
+ "src/hub/deliverable-files.ts",
252
+ "src/hub/release-admission.ts",
253
+ "src/cli/sdlc-output.ts",
254
+ "src/cli/sdlc-release-guard.ts",
255
+ "scripts/check-docs.mjs",
256
+ "scripts/release-prepare.ts",
257
+ "scripts/release-tag.ts",
258
+ "scripts/lib/release-plan.ts",
259
+ "scripts/ci-reuse.mjs",
260
+ ".github/workflows/check.yml",
261
+ ".github/workflows/release.yml"
262
+ ]
263
+ },
264
+ "docs/text-projection.md": {
265
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
266
+ "paths": [
267
+ "src/hub/text-projection.ts",
268
+ "src/hub/projection-exec.ts",
269
+ "src/hub/projected-diff.ts",
270
+ "src/hub/review-material.ts",
271
+ "src/hub/config-trust.ts",
272
+ "src/hub/config-apply.ts"
273
+ ]
274
+ },
45
275
  "docs/agent-notes/adapters.md": {
46
- "verifiedAgainst": "d31d7503fce542f37ed9cdacb3c40fc86786cb09",
276
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
47
277
  "paths": [
48
278
  "src/adapters/",
49
279
  "src/pi/",
@@ -81,7 +311,7 @@
81
311
  ]
82
312
  },
83
313
  "docs/agent-notes/benchmarks.md": {
84
- "verifiedAgainst": "af37f8fd8b44a2c566aa47629ec5b02ee9f91d69",
314
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
85
315
  "paths": [
86
316
  "scripts/benchmarks/",
87
317
  "test/benchmarks/",
@@ -93,7 +323,7 @@
93
323
  ]
94
324
  },
95
325
  "docs/agent-notes/budget.md": {
96
- "verifiedAgainst": "10efdc8b0ea114ae858fff4ede65de09f6c55604",
326
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
97
327
  "paths": [
98
328
  "src/hub/budget.ts",
99
329
  "src/cli/statusline-tee.ts",
@@ -117,7 +347,7 @@
117
347
  ]
118
348
  },
119
349
  "docs/agent-notes/bus.md": {
120
- "verifiedAgainst": "10efdc8b0ea114ae858fff4ede65de09f6c55604",
350
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
121
351
  "paths": [
122
352
  "src/hub/bus.ts",
123
353
  "src/hub/envelope.ts",
@@ -132,7 +362,7 @@
132
362
  ]
133
363
  },
134
364
  "docs/agent-notes/daemon.md": {
135
- "verifiedAgainst": "d31d7503fce542f37ed9cdacb3c40fc86786cb09",
365
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
136
366
  "paths": [
137
367
  "src/hub/daemon.ts",
138
368
  "src/hub/control-client.ts",
@@ -223,7 +453,7 @@
223
453
  ]
224
454
  },
225
455
  "docs/agent-notes/local-worker.md": {
226
- "verifiedAgainst": "af37f8fd8b44a2c566aa47629ec5b02ee9f91d69",
456
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
227
457
  "paths": [
228
458
  "src/adapters/local-worker.ts",
229
459
  "src/local/",
@@ -235,7 +465,7 @@
235
465
  ]
236
466
  },
237
467
  "docs/agent-notes/models.md": {
238
- "verifiedAgainst": "ce8da3ec141f7ef17e2e1cd6a8104ddc36304efe",
468
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
239
469
  "paths": [
240
470
  "src/models/",
241
471
  "src/hub/inference.ts",
@@ -243,7 +473,7 @@
243
473
  ]
244
474
  },
245
475
  "docs/agent-notes/tasks.md": {
246
- "verifiedAgainst": "d31d7503fce542f37ed9cdacb3c40fc86786cb09",
476
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
247
477
  "paths": [
248
478
  "src/hub/tasks.ts",
249
479
  "src/hub/board.ts",
@@ -291,7 +521,7 @@
291
521
  ]
292
522
  },
293
523
  "docs/agent-notes/tests.md": {
294
- "verifiedAgainst": "d31d7503fce542f37ed9cdacb3c40fc86786cb09",
524
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
295
525
  "paths": [
296
526
  "test/",
297
527
  "scripts/check.sh",
@@ -320,7 +550,7 @@
320
550
  ]
321
551
  },
322
552
  "docs/agent-notes/README.md": {
323
- "verifiedAgainst": "2f4c372a6ce48dc01acb4a002f6a46e9557cbd17",
553
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
324
554
  "paths": [
325
555
  "src/cli/console-state.ts",
326
556
  "src/cli/attention.ts",
@@ -329,7 +559,7 @@
329
559
  ]
330
560
  },
331
561
  "src/cli/help.ts": {
332
- "verifiedAgainst": "d31d7503fce542f37ed9cdacb3c40fc86786cb09",
562
+ "verifiedAgainst": "44c523e1e08b36974e3313a90bca9b25b24e0134",
333
563
  "paths": [
334
564
  "src/cli/main.ts",
335
565
  "src/cli/launch.ts",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@staix/agent-hub",
3
- "version": "0.34.0",
3
+ "version": "0.35.0",
4
4
  "description": "Native multi-agent hub: Claude Code, Codex, Kimi Code, Pi and local inference as peers in one project",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -17,11 +17,11 @@
17
17
  "bun": ">=1.4.2"
18
18
  },
19
19
  "dependencies": {
20
- "@staix/agent-mem": "0.22.1"
20
+ "@staix/agent-mem": "0.23.1"
21
21
  },
22
22
  "devDependencies": {
23
23
  "@modelcontextprotocol/sdk": "^1.27.1",
24
- "@staix/agent-console": "0.1.3",
24
+ "@staix/agent-console": "0.1.7",
25
25
  "@types/bun": "^1.3.0",
26
26
  "typescript": "^5.8.0"
27
27
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-hub",
3
- "version": "0.34.0",
3
+ "version": "0.35.0",
4
4
  "description": "Channel between Claude Code and the agent-hub daemon: peer messages from Codex, Kimi and the local worker arrive as channel events; hub_send replies.",
5
5
  "author": {
6
6
  "name": "Young Joon Lee",