@nebutra/agent-runtime 0.2.0 → 0.2.1

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 (78) hide show
  1. package/.turbo/turbo-build.log +65 -50
  2. package/.turbo/turbo-test.log +39 -36
  3. package/.turbo/turbo-typecheck.log +1 -1
  4. package/CHANGELOG.md +12 -15
  5. package/README.md +2 -0
  6. package/dist/adapters/dispatcher-sse.js +1 -0
  7. package/dist/adapters/index.js +1 -0
  8. package/dist/adapters/mcp-catalog.js +1 -0
  9. package/dist/adapters/prisma-rollout.js +1 -0
  10. package/dist/chunk-424PT5DM.js +23 -0
  11. package/dist/chunk-424PT5DM.js.map +1 -0
  12. package/dist/{chunk-NN7DATXA.js → chunk-4Y25ZTKI.js} +3 -3
  13. package/dist/chunk-4Y25ZTKI.js.map +1 -0
  14. package/dist/{chunk-BJBBR3QA.js → chunk-D4YAPLOW.js} +4 -4
  15. package/dist/chunk-D4YAPLOW.js.map +1 -0
  16. package/dist/{chunk-ZMYX5VBU.js → chunk-GQZKYWFT.js} +23 -7
  17. package/dist/chunk-GQZKYWFT.js.map +1 -0
  18. package/dist/chunk-KCNN4QUQ.js +255 -0
  19. package/dist/chunk-KCNN4QUQ.js.map +1 -0
  20. package/dist/chunk-MX2WL43P.js +90 -0
  21. package/dist/chunk-MX2WL43P.js.map +1 -0
  22. package/dist/{chunk-PGGWSUTM.js → chunk-NI4EDT4T.js} +2 -2
  23. package/dist/chunk-NI4EDT4T.js.map +1 -0
  24. package/dist/{chunk-5N4644PB.js → chunk-SD2ZJ7XG.js} +4 -4
  25. package/dist/cli.d.ts +2 -0
  26. package/dist/cli.js +52 -0
  27. package/dist/cli.js.map +1 -0
  28. package/dist/commands.js +1 -0
  29. package/dist/definitions.js +1 -0
  30. package/dist/dispatcher.js +1 -0
  31. package/dist/durable-turn.js +3 -2
  32. package/dist/hook-pipeline.js +1 -0
  33. package/dist/index.d.ts +8 -85
  34. package/dist/index.js +237 -119
  35. package/dist/index.js.map +1 -1
  36. package/dist/loop.d.ts +2 -2
  37. package/dist/loop.js +3 -2
  38. package/dist/mcp-bridge.d.ts +3 -3
  39. package/dist/mcp-bridge.js +3 -2
  40. package/dist/model.js +1 -0
  41. package/dist/orchestration.d.ts +43 -0
  42. package/dist/orchestration.js +12 -0
  43. package/dist/orchestration.js.map +1 -0
  44. package/dist/policy.js +1 -0
  45. package/dist/protocol.js +1 -0
  46. package/dist/pulsar.d.ts +78 -0
  47. package/dist/pulsar.js +17 -0
  48. package/dist/pulsar.js.map +1 -0
  49. package/dist/rollout-store-persistent.js +1 -0
  50. package/dist/rollout.js +1 -0
  51. package/dist/sandbox.js +1 -0
  52. package/dist/skills.js +2 -1
  53. package/dist/subagents.js +1 -0
  54. package/dist/tools.d.ts +4 -3
  55. package/dist/tools.js +5 -3
  56. package/examples/pulsar-quickstart.ts +35 -0
  57. package/examples/resume-branch.ts +45 -0
  58. package/examples/subagent-fanout.ts +20 -0
  59. package/package.json +12 -5
  60. package/src/cli.ts +49 -0
  61. package/src/context-compaction.ts +6 -2
  62. package/src/index.ts +2 -0
  63. package/src/loop.ts +2 -2
  64. package/src/mcp-bridge.ts +8 -3
  65. package/src/orchestration.test.ts +53 -0
  66. package/src/orchestration.ts +146 -0
  67. package/src/permission-ruleset.ts +1 -200
  68. package/src/pulsar.test.ts +156 -0
  69. package/src/pulsar.ts +322 -0
  70. package/src/skills.ts +30 -8
  71. package/src/tools.test.ts +12 -0
  72. package/src/tools.ts +5 -2
  73. package/tsup.config.ts +4 -1
  74. package/dist/chunk-BJBBR3QA.js.map +0 -1
  75. package/dist/chunk-NN7DATXA.js.map +0 -1
  76. package/dist/chunk-PGGWSUTM.js.map +0 -1
  77. package/dist/chunk-ZMYX5VBU.js.map +0 -1
  78. /package/dist/{chunk-5N4644PB.js.map → chunk-SD2ZJ7XG.js.map} +0 -0
@@ -1,81 +1,94 @@
1
1
 
2
- > @nebutra/agent-runtime@0.2.0 build /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/agent-runtime
2
+ > @nebutra/agent-runtime@0.2.1 build /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/agent-runtime
3
3
  > tsup
4
4
 
5
- CLI Building entry: {"index":"src/index.ts","adapters/index":"src/adapters/index.ts","adapters/dispatcher-sse":"src/adapters/dispatcher-sse.ts","adapters/mcp-catalog":"src/adapters/mcp-catalog.ts","adapters/prisma-rollout":"src/adapters/prisma-rollout.ts","commands":"src/commands.ts","definitions":"src/definitions.ts","dispatcher":"src/dispatcher.ts","durable-turn":"src/durable-turn.ts","hook-pipeline":"src/hook-pipeline.ts","loop":"src/loop.ts","mcp-bridge":"src/mcp-bridge.ts","model":"src/model.ts","policy":"src/policy.ts","protocol":"src/protocol.ts","rollout":"src/rollout.ts","rollout-store-persistent":"src/rollout-store-persistent.ts","sandbox":"src/sandbox.ts","skills":"src/skills.ts","subagents":"src/subagents.ts","tools":"src/tools.ts"}
5
+ CLI Building entry: {"index":"src/index.ts","adapters/index":"src/adapters/index.ts","adapters/dispatcher-sse":"src/adapters/dispatcher-sse.ts","adapters/mcp-catalog":"src/adapters/mcp-catalog.ts","adapters/prisma-rollout":"src/adapters/prisma-rollout.ts","commands":"src/commands.ts","cli":"src/cli.ts","definitions":"src/definitions.ts","dispatcher":"src/dispatcher.ts","durable-turn":"src/durable-turn.ts","hook-pipeline":"src/hook-pipeline.ts","loop":"src/loop.ts","mcp-bridge":"src/mcp-bridge.ts","model":"src/model.ts","orchestration":"src/orchestration.ts","policy":"src/policy.ts","protocol":"src/protocol.ts","pulsar":"src/pulsar.ts","rollout":"src/rollout.ts","rollout-store-persistent":"src/rollout-store-persistent.ts","sandbox":"src/sandbox.ts","skills":"src/skills.ts","subagents":"src/subagents.ts","tools":"src/tools.ts"}
6
6
  CLI Using tsconfig: tsconfig.json
7
7
  CLI tsup v8.5.1
8
8
  CLI Using tsup config: /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/agent-runtime/tsup.config.ts
9
9
  CLI Target: es2022
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
- ESM dist/rollout-store-persistent.js 189.00 B
13
- ESM dist/adapters/index.js 449.00 B
14
- ESM dist/sandbox.js 318.00 B
15
- ESM dist/skills.js 185.00 B
16
- ESM dist/subagents.js 374.00 B
17
- ESM dist/tools.js 146.00 B
18
- ESM dist/durable-turn.js 191.00 B
19
- ESM dist/hook-pipeline.js 214.00 B
20
- ESM dist/loop.js 163.00 B
21
- ESM dist/mcp-bridge.js 157.00 B
22
- ESM dist/model.js 156.00 B
23
- ESM dist/policy.js 497.00 B
24
- ESM dist/protocol.js 263.00 B
25
- ESM dist/rollout.js 286.00 B
26
- ESM dist/index.js 93.88 KB
12
+ ESM dist/protocol.js 293.00 B
13
+ ESM dist/adapters/index.js 480.00 B
14
+ ESM dist/pulsar.js 349.00 B
15
+ ESM dist/rollout.js 316.00 B
16
+ ESM dist/rollout-store-persistent.js 219.00 B
17
+ ESM dist/sandbox.js 348.00 B
18
+ ESM dist/skills.js 215.00 B
19
+ ESM dist/subagents.js 404.00 B
20
+ ESM dist/tools.js 229.00 B
21
+ ESM dist/dispatcher.js 191.00 B
22
+ ESM dist/durable-turn.js 221.00 B
23
+ ESM dist/hook-pipeline.js 244.00 B
24
+ ESM dist/loop.js 193.00 B
25
+ ESM dist/mcp-bridge.js 187.00 B
26
+ ESM dist/model.js 186.00 B
27
+ ESM dist/orchestration.js 234.00 B
28
+ ESM dist/policy.js 527.00 B
29
+ ESM dist/index.js 100.03 KB
30
+ ESM dist/chunk-KCNN4QUQ.js 6.91 KB
27
31
  ESM dist/chunk-2DA6Q6TN.js 3.42 KB
28
32
  ESM dist/chunk-MUF7ZZTO.js 1.62 KB
29
- ESM dist/chunk-ZMYX5VBU.js 4.14 KB
30
- ESM dist/chunk-5N4644PB.js 1.92 KB
33
+ ESM dist/chunk-GQZKYWFT.js 4.41 KB
31
34
  ESM dist/chunk-5YS7WAPS.js 5.67 KB
32
- ESM dist/chunk-BJBBR3QA.js 4.19 KB
35
+ ESM dist/chunk-RDKYDMXT.js 4.08 KB
36
+ ESM dist/chunk-FUG5DT2C.js 2.45 KB
37
+ ESM dist/chunk-SD2ZJ7XG.js 1.92 KB
33
38
  ESM dist/chunk-LO24VOA3.js 6.31 KB
34
- ESM dist/chunk-PGGWSUTM.js 1.00 KB
35
- ESM dist/chunk-NN7DATXA.js 1.38 KB
39
+ ESM dist/chunk-D4YAPLOW.js 4.19 KB
40
+ ESM dist/chunk-37BBB2P2.js 2.19 KB
41
+ ESM dist/chunk-NI4EDT4T.js 1.00 KB
42
+ ESM dist/chunk-4Y25ZTKI.js 1.40 KB
36
43
  ESM dist/chunk-6EGG2OZC.js 324.00 B
44
+ ESM dist/chunk-MX2WL43P.js 3.28 KB
37
45
  ESM dist/chunk-CGRCUKGT.js 2.38 KB
38
- ESM dist/chunk-37BBB2P2.js 2.19 KB
39
- ESM dist/adapters/dispatcher-sse.js 214.00 B
46
+ ESM dist/adapters/dispatcher-sse.js 245.00 B
40
47
  ESM dist/chunk-ZTSKS42I.js 3.65 KB
41
- ESM dist/adapters/mcp-catalog.js 187.00 B
48
+ ESM dist/adapters/mcp-catalog.js 218.00 B
42
49
  ESM dist/chunk-24ZXP7FI.js 2.47 KB
43
- ESM dist/adapters/prisma-rollout.js 160.00 B
50
+ ESM dist/adapters/prisma-rollout.js 191.00 B
44
51
  ESM dist/chunk-57W3AR43.js 1.55 KB
45
- ESM dist/commands.js 187.00 B
52
+ ESM dist/commands.js 217.00 B
46
53
  ESM dist/chunk-YYFPDBJG.js 1.86 KB
47
- ESM dist/definitions.js 292.00 B
54
+ ESM dist/cli.js 1.30 KB
55
+ ESM dist/definitions.js 322.00 B
48
56
  ESM dist/chunk-7BUOF367.js 4.13 KB
49
- ESM dist/dispatcher.js 161.00 B
50
- ESM dist/chunk-RDKYDMXT.js 4.08 KB
51
- ESM dist/chunk-FUG5DT2C.js 2.45 KB
52
- ESM dist/rollout-store-persistent.js.map 71.00 B
57
+ ESM dist/chunk-424PT5DM.js 919.00 B
58
+ ESM dist/protocol.js.map 71.00 B
53
59
  ESM dist/adapters/index.js.map 71.00 B
60
+ ESM dist/pulsar.js.map 71.00 B
61
+ ESM dist/rollout.js.map 71.00 B
62
+ ESM dist/rollout-store-persistent.js.map 71.00 B
54
63
  ESM dist/sandbox.js.map 71.00 B
55
64
  ESM dist/skills.js.map 71.00 B
56
65
  ESM dist/subagents.js.map 71.00 B
57
66
  ESM dist/tools.js.map 71.00 B
67
+ ESM dist/dispatcher.js.map 71.00 B
58
68
  ESM dist/durable-turn.js.map 71.00 B
59
69
  ESM dist/hook-pipeline.js.map 71.00 B
60
70
  ESM dist/loop.js.map 71.00 B
61
71
  ESM dist/mcp-bridge.js.map 71.00 B
62
72
  ESM dist/model.js.map 71.00 B
73
+ ESM dist/orchestration.js.map 71.00 B
63
74
  ESM dist/policy.js.map 71.00 B
64
- ESM dist/protocol.js.map 71.00 B
65
- ESM dist/rollout.js.map 71.00 B
66
- ESM dist/index.js.map 251.69 KB
75
+ ESM dist/index.js.map 246.22 KB
76
+ ESM dist/chunk-KCNN4QUQ.js.map 14.41 KB
67
77
  ESM dist/chunk-2DA6Q6TN.js.map 8.01 KB
68
78
  ESM dist/chunk-MUF7ZZTO.js.map 4.91 KB
69
- ESM dist/chunk-ZMYX5VBU.js.map 12.29 KB
70
- ESM dist/chunk-5N4644PB.js.map 6.73 KB
79
+ ESM dist/chunk-GQZKYWFT.js.map 13.03 KB
71
80
  ESM dist/chunk-5YS7WAPS.js.map 15.75 KB
72
- ESM dist/chunk-BJBBR3QA.js.map 10.81 KB
81
+ ESM dist/chunk-RDKYDMXT.js.map 8.81 KB
82
+ ESM dist/chunk-FUG5DT2C.js.map 7.87 KB
83
+ ESM dist/chunk-SD2ZJ7XG.js.map 6.73 KB
73
84
  ESM dist/chunk-LO24VOA3.js.map 17.32 KB
74
- ESM dist/chunk-PGGWSUTM.js.map 3.50 KB
75
- ESM dist/chunk-NN7DATXA.js.map 5.34 KB
85
+ ESM dist/chunk-D4YAPLOW.js.map 10.82 KB
86
+ ESM dist/chunk-37BBB2P2.js.map 6.88 KB
87
+ ESM dist/chunk-NI4EDT4T.js.map 3.53 KB
88
+ ESM dist/chunk-4Y25ZTKI.js.map 5.46 KB
76
89
  ESM dist/chunk-6EGG2OZC.js.map 5.96 KB
90
+ ESM dist/chunk-MX2WL43P.js.map 6.96 KB
77
91
  ESM dist/chunk-CGRCUKGT.js.map 7.65 KB
78
- ESM dist/chunk-37BBB2P2.js.map 6.88 KB
79
92
  ESM dist/adapters/dispatcher-sse.js.map 71.00 B
80
93
  ESM dist/chunk-ZTSKS42I.js.map 10.83 KB
81
94
  ESM dist/adapters/mcp-catalog.js.map 71.00 B
@@ -84,15 +97,15 @@
84
97
  ESM dist/chunk-57W3AR43.js.map 4.88 KB
85
98
  ESM dist/commands.js.map 71.00 B
86
99
  ESM dist/chunk-YYFPDBJG.js.map 6.97 KB
100
+ ESM dist/cli.js.map 2.29 KB
87
101
  ESM dist/definitions.js.map 71.00 B
88
102
  ESM dist/chunk-7BUOF367.js.map 10.17 KB
89
- ESM dist/dispatcher.js.map 71.00 B
90
- ESM dist/chunk-RDKYDMXT.js.map 8.81 KB
91
- ESM dist/chunk-FUG5DT2C.js.map 7.87 KB
92
- ESM ⚡️ Build success in 132ms
103
+ ESM dist/chunk-424PT5DM.js.map 71.00 B
104
+ ESM ⚡️ Build success in 361ms
93
105
  DTS Build start
94
- DTS ⚡️ Build success in 8571ms
106
+ DTS ⚡️ Build success in 13376ms
95
107
  DTS dist/adapters/index.d.ts 581.00 B
108
+ DTS dist/cli.d.ts 13.00 B
96
109
  DTS dist/adapters/dispatcher-sse.d.ts 3.18 KB
97
110
  DTS dist/adapters/mcp-catalog.d.ts 2.77 KB
98
111
  DTS dist/adapters/prisma-rollout.d.ts 2.10 KB
@@ -100,8 +113,10 @@
100
113
  DTS dist/dispatcher.d.ts 1.91 KB
101
114
  DTS dist/durable-turn.d.ts 2.55 KB
102
115
  DTS dist/hook-pipeline.d.ts 5.33 KB
103
- DTS dist/loop.d.ts 3.15 KB
104
- DTS dist/mcp-bridge.d.ts 1.89 KB
116
+ DTS dist/mcp-bridge.d.ts 1.91 KB
117
+ DTS dist/orchestration.d.ts 1.64 KB
118
+ DTS dist/pulsar.d.ts 2.71 KB
119
+ DTS dist/loop.d.ts 3.16 KB
105
120
  DTS dist/protocol.d.ts 5.32 KB
106
121
  DTS dist/rollout-store-persistent.d.ts 1.77 KB
107
122
  DTS dist/rollout.d.ts 3.28 KB
@@ -111,5 +126,5 @@
111
126
  DTS dist/subagents.d.ts 5.74 KB
112
127
  DTS dist/model.d.ts 5.79 KB
113
128
  DTS dist/definitions.d.ts 3.96 KB
114
- DTS dist/tools.d.ts 2.95 KB
115
- DTS dist/index.d.ts 86.35 KB
129
+ DTS dist/tools.d.ts 3.01 KB
130
+ DTS dist/index.d.ts 83.11 KB
@@ -1,44 +1,47 @@
1
1
 
2
- > @nebutra/agent-runtime@0.2.0 test /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/agent-runtime
2
+ > @nebutra/agent-runtime@0.2.1 test /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/agent-runtime
3
3
  > vitest run
4
4
 
5
5
 
6
6
   RUN  v4.1.4 /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/agent-runtime
7
7
 
8
- ✓ src/code-review.test.ts (43 tests) 183ms
9
- ✓ src/context-compaction.test.ts (38 tests) 154ms
10
- ✓ src/channel-gateway.test.ts (32 tests) 172ms
11
- ✓ src/permission-ruleset.test.ts (41 tests) 70ms
12
- ✓ src/fuzzy-match.test.ts (36 tests) 77ms
13
- ✓ src/inbound-admission.test.ts (45 tests) 61ms
14
- ✓ src/session-share.test.ts (29 tests) 101ms
15
- ✓ src/artifact-stream.test.ts (27 tests) 120ms
16
- ✓ src/skills.test.ts (16 tests) 96ms
17
- ✓ src/command-suggestions.test.ts (25 tests) 69ms
18
- ✓ src/commit-message.test.ts (29 tests) 98ms
19
- ✓ src/subagents.test.ts (20 tests) 82ms
20
- ✓ src/hook-pipeline.test.ts (18 tests) 165ms
21
- ✓ src/memory-provider.test.ts (18 tests) 100ms
22
- ✓ src/adapters/dispatcher-sse.test.ts (11 tests) 194ms
23
- ✓ src/project-repo.test.ts (13 tests) 35ms
24
- ✓ src/dispatcher.test.ts (16 tests) 190ms
25
- ✓ src/commands.test.ts (16 tests) 52ms
26
- ✓ src/workbench.test.ts (19 tests) 42ms
27
- ✓ src/rollout-store-persistent.test.ts (12 tests) 41ms
28
- ✓ src/adapters/mcp-catalog.test.ts (9 tests) 48ms
29
- ✓ src/edit-planner.test.ts (21 tests) 33ms
30
- ✓ src/durable-turn.test.ts (5 tests) 31ms
31
- ✓ src/deployment-status.test.ts (20 tests) 73ms
32
- ✓ src/skill-distillation.test.ts (18 tests) 108ms
33
- ✓ src/design-context.test.ts (17 tests) 47ms
34
- ✓ src/agent-runtime.test.ts (15 tests) 112ms
35
- ✓ src/mcp-bridge.test.ts (7 tests) 41ms
36
- ✓ src/definitions.test.ts (6 tests) 18ms
37
- ✓ src/adapters/prisma-rollout.test.ts (6 tests) 21ms
38
- ✓ src/loop.test.ts (4 tests) 21ms
8
+ ✓ src/context-compaction.test.ts (38 tests) 131ms
9
+ ✓ src/channel-gateway.test.ts (32 tests) 237ms
10
+ ✓ src/code-review.test.ts (43 tests) 240ms
11
+ ✓ src/inbound-admission.test.ts (45 tests) 214ms
12
+ ✓ src/fuzzy-match.test.ts (36 tests) 138ms
13
+ ✓ src/permission-ruleset.test.ts (41 tests) 245ms
14
+ ✓ src/session-share.test.ts (29 tests) 136ms
15
+ ✓ src/artifact-stream.test.ts (27 tests) 193ms
16
+ ✓ src/skills.test.ts (16 tests) 198ms
17
+ ✓ src/command-suggestions.test.ts (25 tests) 157ms
18
+ ✓ src/commit-message.test.ts (29 tests) 173ms
19
+ ✓ src/subagents.test.ts (20 tests) 74ms
20
+ ✓ src/hook-pipeline.test.ts (18 tests) 289ms
21
+ ✓ src/memory-provider.test.ts (18 tests) 139ms
22
+ ✓ src/project-repo.test.ts (13 tests) 112ms
23
+ ✓ src/adapters/dispatcher-sse.test.ts (11 tests) 282ms
24
+ ✓ src/dispatcher.test.ts (16 tests) 213ms
25
+ ✓ src/commands.test.ts (16 tests) 69ms
26
+ ✓ src/workbench.test.ts (19 tests) 113ms
27
+ ✓ src/adapters/mcp-catalog.test.ts (9 tests) 126ms
28
+ ✓ src/rollout-store-persistent.test.ts (12 tests) 148ms
29
+ ✓ src/edit-planner.test.ts (21 tests) 146ms
30
+ ✓ src/deployment-status.test.ts (20 tests) 69ms
31
+ ✓ src/durable-turn.test.ts (5 tests) 54ms
32
+ ✓ src/skill-distillation.test.ts (18 tests) 40ms
33
+ ✓ src/design-context.test.ts (17 tests) 49ms
34
+ ✓ src/mcp-bridge.test.ts (7 tests) 49ms
35
+ ✓ src/agent-runtime.test.ts (15 tests) 98ms
36
+ ✓ src/adapters/prisma-rollout.test.ts (6 tests) 41ms
37
+ ✓ src/loop.test.ts (4 tests) 40ms
38
+ ✓ src/pulsar.test.ts (4 tests) 44ms
39
+ ✓ src/definitions.test.ts (6 tests) 13ms
40
+ ✓ src/orchestration.test.ts (4 tests) 9ms
41
+ ✓ src/tools.test.ts (1 test) 15ms
39
42
 
40
-  Test Files  31 passed (31)
41
-  Tests  632 passed (632)
42
-  Start at  16:51:20
43
-  Duration  9.97s (transform 4.25s, setup 0ms, import 10.84s, tests 2.65s, environment 12ms)
43
+  Test Files  34 passed (34)
44
+  Tests  641 passed (641)
45
+  Start at  08:15:22
46
+  Duration  15.08s (transform 4.12s, setup 0ms, import 15.30s, tests 4.29s, environment 6ms)
44
47
 
@@ -1,4 +1,4 @@
1
1
 
2
- > @nebutra/agent-runtime@0.2.0 typecheck /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/agent-runtime
2
+ > @nebutra/agent-runtime@0.2.1 typecheck /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/agent-runtime
3
3
  > tsc --noEmit
4
4
 
package/CHANGELOG.md CHANGED
@@ -1,12 +1,23 @@
1
1
  # @nebutra/agent-runtime
2
2
 
3
+ ## 0.2.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Publish registry package metadata under the MIT license.
8
+
9
+ - Updated dependencies []:
10
+ - @nebutra/ai-primitives@0.1.1
11
+ - @nebutra/capability-kit@0.2.1
12
+ - @nebutra/execution-policy@0.1.1
13
+ - @nebutra/mcp@0.1.2
14
+
3
15
  ## 0.2.0
4
16
 
5
17
  ### Minor Changes
6
18
 
7
19
  - [`fab751f`](https://github.com/Nebutra/Nebutra-Sailor/commit/fab751f39639251bfa006b1bfbcd8cd62f94626a) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - New adapter subpaths inside `@nebutra/agent-runtime`: concrete reusable port
8
20
  adapters for the runtime package.
9
-
10
21
  - `mcp-catalog`: adapts `@nebutra/mcp` `serverRegistry`/`mcpClient` into the
11
22
  `McpServerCatalogPort` / `McpClientLike` ports — plan-gated, tenant
12
23
  fail-closed, schema-less MCP tools still yield usable definitions,
@@ -22,7 +33,6 @@
22
33
  governance decision — documented in the README).
23
34
 
24
35
  - [`4865ac9`](https://github.com/Nebutra/Nebutra-Sailor/commit/4865ac9bff6dd83635bc33e4aeb348b087dee7c7) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Absorb the IDE-coding-agent delta (over the already-absorbed CLI core).
25
-
26
36
  - `code-review`: a pure unified-diff parser, branch-base resolution, a
27
37
  confidence-banded review prompt (CRITICAL ≥95% / WARNING ≥85% /
28
38
  SUGGESTION ≥75% / below → omit) with an untrusted-content injection guard
@@ -43,7 +53,6 @@
43
53
  impurity is an injected model/summarize port. 632 package tests.
44
54
 
45
55
  - [`67f9cd0`](https://github.com/Nebutra/Nebutra-Sailor/commit/67f9cd02c0ee908f0579efadc4292d535a758c16) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Durable rollout-store backend (the agent-runtime system-of-record).
46
-
47
56
  - New Prisma model `AgentRolloutLine` → table `agent_rollout_lines`, additive
48
57
  migration `20260519000000_add_agent_rollout_store` (one CREATE TABLE).
49
58
  - `createPrismaRolloutPersistence` in `@nebutra/agent-runtime-adapters`:
@@ -55,7 +64,6 @@
55
64
  migrate+generate deploy step (ADR 2026-05-19), not faked durability.
56
65
 
57
66
  - [`bb1b126`](https://github.com/Nebutra/Nebutra-Sailor/commit/bb1b126e82379d88da10f43a86d9d07bccc3a224) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Absorb the git-backed-project delta (over the already-absorbed core).
58
-
59
67
  - `project-repo`: durable project = git repo. Metadata + per-conversation
60
68
  jsonl logs persisted as committed files (one commit per turn); history /
61
69
  restore by commit SHA (commit graph IS the history — distinct from
@@ -71,7 +79,6 @@ failed`), latest-status + timeline-from-commits derivations, explicit
71
79
  renamed `DeploymentCommitRef`). 252 package tests.
72
80
 
73
81
  - [`da6bfea`](https://github.com/Nebutra/Nebutra-Sailor/commit/da6bfeaf6c323a9aecefdd65c481a9852aee25b9) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Add `@nebutra/agent-runtime`: a multi-tenant agent-runtime grammar.
74
-
75
82
  - New package re-expresses a coding-agent runtime _design_ in Sailor grammar —
76
83
  thread/turn/item model + event lifecycle, two-axis approval/capability
77
84
  policy, uniform tool/MCP abstraction, event-sourced rollout with compaction,
@@ -85,7 +92,6 @@ failed`), latest-status + timeline-from-commits derivations, explicit
85
92
 
86
93
  - [`3c5c43e`](https://github.com/Nebutra/Nebutra-Sailor/commit/3c5c43e1c07c03da936d2948408f8abb4b113321) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Absorb the differentiated coding-agent-harness capabilities (the delta over
87
94
  the already-absorbed core).
88
-
89
95
  - `definitions`: shared layered-tier resolver (precedence + dual
90
96
  availability/enabled gate) + frontmatter parser — backs commands, skills,
91
97
  subagents from one kernel.
@@ -106,7 +112,6 @@ failed`), latest-status + timeline-from-commits derivations, explicit
106
112
  transports deliberately dropped for multi-tenant safety). 135 package tests.
107
113
 
108
114
  - [`a29b2d9`](https://github.com/Nebutra/Nebutra-Sailor/commit/a29b2d997416edc4e421b31b777724ae70e4da54) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Add the agent loop runner — the turn engine.
109
-
110
115
  - `runTurn()` drives a turn `loop { model_call → emit items → execute tools
111
116
  → feed results back }` until the model stops requesting tools or a bounded
112
117
  step ceiling is hit. Single-threaded (shared context, no conflicting
@@ -120,7 +125,6 @@ failed`), latest-status + timeline-from-commits derivations, explicit
120
125
  thrown to the caller.
121
126
 
122
127
  - [`cd34724`](https://github.com/Nebutra/Nebutra-Sailor/commit/cd347242ab6874931a74aa72aa9a0d183f7dd5d3) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Absorb the multi-channel-gateway delta (over the already-absorbed core).
123
-
124
128
  - `channel-gateway`: channel-agnostic `InboundMessage`/`OutboundMessage`
125
129
  normalization, a `ChannelAdapter` port (parseInbound returns null for
126
130
  non-message events, never throws on junk), tenant-scoped `ChannelRegistry`,
@@ -138,7 +142,6 @@ failed`), latest-status + timeline-from-commits derivations, explicit
138
142
  - [`447e948`](https://github.com/Nebutra/Nebutra-Sailor/commit/447e948a7153446e7bc3769395c1687c9f27c991) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Close the runtime gap — four capabilities, all tenant-scoped & fail-closed,
139
143
  each behind an injectable port so the package keeps zero datastore/queue
140
144
  dependency ("no infra change" stays honest):
141
-
142
145
  - **Durable / resumable turn** (`durable-turn.ts`): `createDurableTurn` wraps
143
146
  `runTurn` behind a `DurableTurnQueuePort`; `resume` replays the rollout and
144
147
  re-drives an unfinished turn, idempotent and cross-tenant isolated.
@@ -155,7 +158,6 @@ failed`), latest-status + timeline-from-commits derivations, explicit
155
158
  seq, faithful round-trip, cross-tenant isolation, typed round-trip errors.
156
159
 
157
160
  - [`b1b9b72`](https://github.com/Nebutra/Nebutra-Sailor/commit/b1b9b7251ef6b1b84e5211dd9b4ae14a1be4b05a) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Absorb the self-improving-loop delta (over the already-absorbed core).
158
-
159
161
  - `memory-provider`: pluggable cross-session `MemoryProvider` port (full
160
162
  lifecycle: initialize/prefetch/syncTurn/onSessionEnd/onSessionSwitch/
161
163
  onPreCompress/onDelegation/systemPromptBlock) + a `MemoryManager` that
@@ -172,7 +174,6 @@ failed`), latest-status + timeline-from-commits derivations, explicit
172
174
  backends are injected ports. 288 package tests.
173
175
 
174
176
  - [`5ed8c38`](https://github.com/Nebutra/Nebutra-Sailor/commit/5ed8c38362e86bad51786383b81cc921b11d1b18) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Absorb the coding-agent share/permission delta (over the already-absorbed core).
175
-
176
177
  - `permission-ruleset`: `Rule{permission,pattern,action:allow|deny|ask}` +
177
178
  `evaluate(...rulesets)` first-match over both dimensions with fail-safe
178
179
  `ask` default, a `wildcardMatch` with the faithful trailing `" *"`-optional
@@ -188,7 +189,6 @@ failed`), latest-status + timeline-from-commits derivations, explicit
188
189
  where stateless; transport/crypto/store injected. 496 package tests.
189
190
 
190
191
  - [`77c0105`](https://github.com/Nebutra/Nebutra-Sailor/commit/77c0105ce89a4ff0f5e86229cce9c2561c1b1c5f) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Absorb the site-clone / targeted-edit delta (over the already-absorbed core).
191
-
192
192
  - `design-context`: website → structured generation seed
193
193
  `{content, brand{colors,fonts}, screenshot, title}` — pure normalizer +
194
194
  injected `ScrapeProvider` port (no network/provider lock-in),
@@ -202,7 +202,6 @@ failed`), latest-status + timeline-from-commits derivations, explicit
202
202
  injected ports. 219 package tests.
203
203
 
204
204
  - [`1e2d929`](https://github.com/Nebutra/Nebutra-Sailor/commit/1e2d9298f4f093cbe81199e7dcd3991116d01ea2) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Absorb the terminal-suggestion delta (over the already-absorbed core).
205
-
206
205
  - `fuzzy-match`: smart-case subsequence fuzzy match returning
207
206
  `{score, indices}` (lowercase query ⇒ case-insensitive; any uppercase ⇒
208
207
  case-sensitive), case-insensitive + ignore-spaces variants (indices map to
@@ -219,7 +218,6 @@ failed`), latest-status + timeline-from-commits derivations, explicit
219
218
  426 package tests.
220
219
 
221
220
  - [`509338e`](https://github.com/Nebutra/Nebutra-Sailor/commit/509338ee5ffc537c108f06cd1fc24a811a5e05b8) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Concrete Track-B coupling for the agent-runtime external-sandbox seam.
222
-
223
221
  - Add `createHttpSandbox(baseUrl)`: an `ExternalSandbox` that delegates
224
222
  execution over HTTP to the decoupled Rust isolator
225
223
  (`backends/rust/sandbox`, `POST /api/v1/sandbox/exec`).
@@ -231,7 +229,6 @@ failed`), latest-status + timeline-from-commits derivations, explicit
231
229
 
232
230
  - [`efe764d`](https://github.com/Nebutra/Nebutra-Sailor/commit/efe764d60085352eae304dc37dc22fda8920e587) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Absorb the web-app-builder delta (the differentiated capabilities over the
233
231
  already-absorbed harness core).
234
-
235
232
  - `artifact-stream`: streaming artifact/action protocol — a chunk-fed
236
233
  incremental parser for an `<artifact>` of ordered
237
234
  `<action type=file|shell|start|build|data>` blocks (split-tag safe, no
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # @nebutra/agent-runtime
2
2
 
3
+ Status: **WIP**
4
+
3
5
  > Status: WIP — not yet integrated into a production app. Track-B kernel
4
6
  > transport and durable-turn queue binding are interface-only.
5
7
 
@@ -3,6 +3,7 @@ import {
3
3
  sseResponse,
4
4
  subscribeNotifications
5
5
  } from "../chunk-ZTSKS42I.js";
6
+ import "../chunk-424PT5DM.js";
6
7
  export {
7
8
  createRpcHandler,
8
9
  sseResponse,
@@ -10,6 +10,7 @@ import {
10
10
  import {
11
11
  createPrismaRolloutPersistence
12
12
  } from "../chunk-57W3AR43.js";
13
+ import "../chunk-424PT5DM.js";
13
14
  export {
14
15
  createMcpClientPort,
15
16
  createMcpServerCatalog,
@@ -2,6 +2,7 @@ import {
2
2
  createMcpClientPort,
3
3
  createMcpServerCatalog
4
4
  } from "../chunk-24ZXP7FI.js";
5
+ import "../chunk-424PT5DM.js";
5
6
  export {
6
7
  createMcpClientPort,
7
8
  createMcpServerCatalog
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  createPrismaRolloutPersistence
3
3
  } from "../chunk-57W3AR43.js";
4
+ import "../chunk-424PT5DM.js";
4
5
  export {
5
6
  createPrismaRolloutPersistence
6
7
  };
@@ -0,0 +1,23 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
18
+
19
+ export {
20
+ __export,
21
+ __reExport
22
+ };
23
+ //# sourceMappingURL=chunk-424PT5DM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,5 +1,5 @@
1
1
  // src/tools.ts
2
- var ToolRegistry = class {
2
+ var RuntimeToolRegistry = class {
3
3
  #tools = /* @__PURE__ */ new Map();
4
4
  #hooks;
5
5
  constructor(hooks = {}) {
@@ -40,7 +40,7 @@ function adaptMcpTool(server, definition, client) {
40
40
  }
41
41
 
42
42
  export {
43
- ToolRegistry,
43
+ RuntimeToolRegistry,
44
44
  adaptMcpTool
45
45
  };
46
- //# sourceMappingURL=chunk-NN7DATXA.js.map
46
+ //# sourceMappingURL=chunk-4Y25ZTKI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools.ts"],"sourcesContent":["/**\n * Tool / MCP abstraction (WRAP — capability #9).\n *\n * Faithful re-expression of the upstream uniform tool model: one\n * `ToolDefinition` interface, JSON-schema in/out, a deferred-load flag, and\n * MCP-as-adapter behind the same interface (MCP tools and native tools are\n * indistinguishable at dispatch). Activates `@nebutra/mcp` primitives rather\n * than re-porting them.\n */\n\nimport type { z } from \"zod\";\n\n/** A tool definition — pure data; transport-agnostic. */\nexport interface ToolDefinition<I = unknown, O = unknown> {\n readonly name: string;\n readonly description: string;\n readonly inputSchema: z.ZodType<I>;\n readonly outputSchema?: z.ZodType<O>;\n /**\n * When true, the full schema is withheld until a `tool_search` discovery\n * step lazily loads it (parity with the upstream deferred-tool pattern).\n */\n readonly deferLoading?: boolean;\n}\n\n/** Source provenance — native vs. adapted from an MCP server. */\nexport type ToolOrigin =\n | { readonly kind: \"native\" }\n | { readonly kind: \"mcp\"; readonly server: string };\n\nexport interface RegisteredTool {\n readonly definition: ToolDefinition;\n readonly origin: ToolOrigin;\n}\n\n/** A tool invocation routed through the registry. */\nexport interface ToolDispatchContext {\n /** Mandatory tenant scope — every dispatch is tenant-bound. */\n readonly tenantId: string;\n readonly threadId: string;\n}\n\nexport type ToolHandler<I = unknown, O = unknown> = (\n input: I,\n ctx: ToolDispatchContext,\n) => Promise<O>;\n\n/** Pre/post dispatch hooks (parity with upstream orchestrator hooks). */\nexport interface ToolHooks {\n readonly preToolUse?: (name: string, input: unknown, ctx: ToolDispatchContext) => Promise<void>;\n readonly postToolUse?: (name: string, output: unknown, ctx: ToolDispatchContext) => Promise<void>;\n}\n\n/**\n * runtime registry -> router -> orchestrator pipeline. MCP tools register via\n * {@link adaptMcpTool} and are dispatched identically to native tools.\n */\nexport class RuntimeToolRegistry {\n readonly #tools = new Map<string, { reg: RegisteredTool; handler: ToolHandler }>();\n readonly #hooks: ToolHooks;\n\n constructor(hooks: ToolHooks = {}) {\n this.#hooks = hooks;\n }\n\n register<I, O>(\n definition: ToolDefinition<I, O>,\n handler: ToolHandler<I, O>,\n origin: ToolOrigin = { kind: \"native\" },\n ): void {\n if (this.#tools.has(definition.name)) {\n throw new Error(`Tool already registered: ${definition.name}`);\n }\n this.#tools.set(definition.name, {\n reg: { definition: definition as ToolDefinition, origin },\n handler: handler as ToolHandler,\n });\n }\n\n list(): readonly RegisteredTool[] {\n return [...this.#tools.values()].map((e) => e.reg);\n }\n\n async dispatch(name: string, rawInput: unknown, ctx: ToolDispatchContext): Promise<unknown> {\n const entry = this.#tools.get(name);\n if (!entry) throw new Error(`Unknown tool: ${name}`);\n const input = entry.reg.definition.inputSchema.parse(rawInput);\n await this.#hooks.preToolUse?.(name, input, ctx);\n const output = await entry.handler(input, ctx);\n const validated = entry.reg.definition.outputSchema\n ? entry.reg.definition.outputSchema.parse(output)\n : output;\n await this.#hooks.postToolUse?.(name, validated, ctx);\n return validated;\n }\n}\n\n/** @deprecated Use RuntimeToolRegistry for new code. */\nexport { RuntimeToolRegistry as ToolRegistry };\n\n/** Minimal shape of an MCP client (satisfied by `@nebutra/mcp`'s `mcpClient`). */\nexport interface McpClientLike {\n executeTool(\n name: string,\n args: unknown,\n ctx: { requestId: string; tenantId: string },\n ): Promise<unknown>;\n}\n\n/**\n * Adapt an external MCP tool into the uniform tool model. The resulting\n * handler delegates to the MCP client; callers cannot tell it apart from a\n * native tool.\n */\nexport function adaptMcpTool(\n server: string,\n definition: ToolDefinition,\n client: McpClientLike,\n): { definition: ToolDefinition; handler: ToolHandler; origin: ToolOrigin } {\n return {\n definition,\n origin: { kind: \"mcp\", server },\n handler: async (input, ctx) =>\n client.executeTool(definition.name, input, {\n requestId: globalThis.crypto?.randomUUID?.() ?? `${Date.now()}`,\n tenantId: ctx.tenantId,\n }),\n };\n}\n"],"mappings":";AAyDO,IAAM,sBAAN,MAA0B;AAAA,EACtB,SAAS,oBAAI,IAA2D;AAAA,EACxE;AAAA,EAET,YAAY,QAAmB,CAAC,GAAG;AACjC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,SACE,YACA,SACA,SAAqB,EAAE,MAAM,SAAS,GAChC;AACN,QAAI,KAAK,OAAO,IAAI,WAAW,IAAI,GAAG;AACpC,YAAM,IAAI,MAAM,4BAA4B,WAAW,IAAI,EAAE;AAAA,IAC/D;AACA,SAAK,OAAO,IAAI,WAAW,MAAM;AAAA,MAC/B,KAAK,EAAE,YAA0C,OAAO;AAAA,MACxD;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,OAAkC;AAChC,WAAO,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG;AAAA,EACnD;AAAA,EAEA,MAAM,SAAS,MAAc,UAAmB,KAA4C;AAC1F,UAAM,QAAQ,KAAK,OAAO,IAAI,IAAI;AAClC,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,iBAAiB,IAAI,EAAE;AACnD,UAAM,QAAQ,MAAM,IAAI,WAAW,YAAY,MAAM,QAAQ;AAC7D,UAAM,KAAK,OAAO,aAAa,MAAM,OAAO,GAAG;AAC/C,UAAM,SAAS,MAAM,MAAM,QAAQ,OAAO,GAAG;AAC7C,UAAM,YAAY,MAAM,IAAI,WAAW,eACnC,MAAM,IAAI,WAAW,aAAa,MAAM,MAAM,IAC9C;AACJ,UAAM,KAAK,OAAO,cAAc,MAAM,WAAW,GAAG;AACpD,WAAO;AAAA,EACT;AACF;AAmBO,SAAS,aACd,QACA,YACA,QAC0E;AAC1E,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,EAAE,MAAM,OAAO,OAAO;AAAA,IAC9B,SAAS,OAAO,OAAO,QACrB,OAAO,YAAY,WAAW,MAAM,OAAO;AAAA,MACzC,WAAW,WAAW,QAAQ,aAAa,KAAK,GAAG,KAAK,IAAI,CAAC;AAAA,MAC7D,UAAU,IAAI;AAAA,IAChB,CAAC;AAAA,EACL;AACF;","names":[]}
@@ -1,11 +1,11 @@
1
+ import {
2
+ sanitizeForPersist
3
+ } from "./chunk-37BBB2P2.js";
1
4
  import {
2
5
  DENIED,
3
6
  isApproval,
4
7
  resolveRuleDecision
5
8
  } from "./chunk-CGRCUKGT.js";
6
- import {
7
- sanitizeForPersist
8
- } from "./chunk-37BBB2P2.js";
9
9
 
10
10
  // src/loop.ts
11
11
  var DEFAULT_MAX_STEPS = 20;
@@ -118,4 +118,4 @@ async function gateToolCall(name, args, deps, ruleEvaluator) {
118
118
  export {
119
119
  runTurn
120
120
  };
121
- //# sourceMappingURL=chunk-BJBBR3QA.js.map
121
+ //# sourceMappingURL=chunk-D4YAPLOW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/loop.ts"],"sourcesContent":["/**\n * Agent loop runner (WRAP — the turn engine).\n *\n * Faithful re-expression of the upstream loop: a turn is\n * `loop { model_call → emit items → execute tools → feed results back }`\n * until the model stops requesting tools or a bounded step ceiling is hit.\n * Single-threaded (Cognition teaching: shared context, no conflicting\n * sub-agent decisions). Every item is appended to the tenant-scoped rollout\n * as it reaches a terminal state, so the turn is resumable by replay.\n *\n * The model call is abstracted behind {@link ModelInvoker} so this WRAPs an\n * existing model stack (e.g. `@nebutra/agents`) rather than re-porting\n * provider/routing/fallback. No untrusted code runs here — command items are\n * dispatched through the tool registry / external-sandbox seam.\n */\n\nimport type { AgentMessageItem, ThreadEvent, ThreadItem, TurnConfig, TurnUsage } from \"./model\";\nimport {\n type ApprovalPolicy,\n DENIED,\n isApproval,\n type ReviewDecision,\n type RuleDecision,\n resolveRuleDecision,\n} from \"./policy\";\nimport type { ServerRequest } from \"./protocol\";\nimport { type RolloutLine, type RolloutStore, sanitizeForPersist } from \"./rollout\";\nimport type { RuntimeToolRegistry, ToolDispatchContext } from \"./tools\";\n\n/** A single thing the model emitted in one round. */\nexport type ModelEmission =\n | { readonly kind: \"text\"; readonly text: string }\n | {\n readonly kind: \"tool_call\";\n readonly id: string;\n readonly name: string;\n readonly args: unknown;\n };\n\nexport interface ModelRoundResult {\n readonly emissions: readonly ModelEmission[];\n readonly usage?: Partial<TurnUsage>;\n}\n\nexport interface ModelRoundRequest {\n readonly config: TurnConfig;\n /** Running transcript: user input, agent text, and tool results. */\n readonly history: readonly { readonly role: string; readonly content: string }[];\n readonly toolNames: readonly string[];\n}\n\n/** Abstracts the model stack — implement over `@nebutra/agents`, etc. */\nexport interface ModelInvoker {\n invoke(request: ModelRoundRequest): Promise<ModelRoundResult>;\n}\n\n/** Server-initiated approval transport (see {@link ServerRequest}). */\nexport interface ApprovalGate {\n request(serverRequest: ServerRequest): Promise<ReviewDecision>;\n}\n\n/** Classifies a tool call into a static rule decision before approval. */\nexport type RuleEvaluator = (toolName: string, args: unknown) => RuleDecision;\n\nexport interface RunTurnDeps {\n readonly tenantId: string;\n readonly threadId: string;\n readonly config: TurnConfig;\n readonly approvalPolicy: ApprovalPolicy;\n readonly model: ModelInvoker;\n readonly tools: RuntimeToolRegistry;\n readonly store: RolloutStore;\n readonly approvalGate: ApprovalGate;\n /** Defaults to: everything requires a prompt (safe). */\n readonly ruleEvaluator?: RuleEvaluator;\n /** Bounded steps (parity with upstream step ceiling). Default 20. */\n readonly maxSteps?: number;\n}\n\nconst DEFAULT_MAX_STEPS = 20;\nconst requirePrompt: RuleEvaluator = () => \"prompt\";\n\nfunction newId(prefix: string): string {\n return `${prefix}_${globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random()}`}`;\n}\n\n/**\n * Drive one turn to completion. Yields the {@link ThreadEvent} stream and\n * appends each terminal item + the turn outcome to the rollout store.\n * Never throws to the caller — failures surface as a `turn.failed` event.\n */\nexport async function* runTurn(userInput: string, deps: RunTurnDeps): AsyncGenerator<ThreadEvent> {\n const at = () => new Date().toISOString();\n const ruleEvaluator = deps.ruleEvaluator ?? requirePrompt;\n const maxSteps = deps.maxSteps ?? DEFAULT_MAX_STEPS;\n const ctx: ToolDispatchContext = { tenantId: deps.tenantId, threadId: deps.threadId };\n\n const append = async (line: RolloutLine): Promise<void> => deps.store.append(line);\n const event = async (e: ThreadEvent): Promise<ThreadEvent> => {\n await append({\n tenantId: deps.tenantId,\n threadId: deps.threadId,\n type: \"event\",\n event:\n e.type === \"item.completed\"\n ? { type: \"item.completed\", item: sanitizeForPersist(e.item) }\n : e,\n at: at(),\n });\n return e;\n };\n\n yield await event({ type: \"turn.started\" });\n\n const history: { role: string; content: string }[] = [{ role: \"user\", content: userInput }];\n let usage: TurnUsage = {\n inputTokens: 0,\n cachedInputTokens: 0,\n outputTokens: 0,\n reasoningOutputTokens: 0,\n };\n\n try {\n for (let step = 0; step < maxSteps; step++) {\n const round = await deps.model.invoke({\n config: deps.config,\n history,\n toolNames: deps.tools.list().map((t) => t.definition.name),\n });\n if (round.usage) {\n const u = round.usage;\n usage = {\n inputTokens: usage.inputTokens + (u.inputTokens ?? 0),\n cachedInputTokens: usage.cachedInputTokens + (u.cachedInputTokens ?? 0),\n outputTokens: usage.outputTokens + (u.outputTokens ?? 0),\n reasoningOutputTokens: usage.reasoningOutputTokens + (u.reasoningOutputTokens ?? 0),\n };\n }\n\n const toolCalls = round.emissions.filter(\n (e): e is Extract<ModelEmission, { kind: \"tool_call\" }> => e.kind === \"tool_call\",\n );\n\n for (const e of round.emissions) {\n if (e.kind !== \"text\") continue;\n const item: AgentMessageItem = { id: newId(\"msg\"), type: \"agent_message\", text: e.text };\n history.push({ role: \"assistant\", content: e.text });\n yield await event({ type: \"item.completed\", item });\n }\n\n if (toolCalls.length === 0) break; // model is done\n\n for (const call of toolCalls) {\n const decision = await gateToolCall(call.name, call.args, deps, ruleEvaluator);\n if (!isApproval(decision)) {\n const failed: ThreadItem = {\n id: call.id,\n type: \"error\",\n message: `tool '${call.name}' not approved (${decision.kind})`,\n };\n history.push({ role: \"tool\", content: `DENIED: ${call.name}` });\n yield await event({ type: \"item.completed\", item: failed });\n continue;\n }\n try {\n const output = await deps.tools.dispatch(call.name, call.args, ctx);\n const item: ThreadItem = {\n id: call.id,\n type: \"mcp_tool_call\",\n server: \"native\",\n tool: call.name,\n arguments: call.args,\n result: { content: output },\n status: \"completed\",\n };\n history.push({ role: \"tool\", content: JSON.stringify(output) });\n yield await event({ type: \"item.completed\", item });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n history.push({ role: \"tool\", content: `ERROR: ${message}` });\n yield await event({\n type: \"item.completed\",\n item: { id: call.id, type: \"error\", message },\n });\n }\n }\n }\n\n yield await event({ type: \"turn.completed\", usage });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n yield await event({ type: \"turn.failed\", error: { message } });\n }\n}\n\n/** Resolve a tool call's approval, raising a server-initiated request if asked. */\nasync function gateToolCall(\n name: string,\n args: unknown,\n deps: RunTurnDeps,\n ruleEvaluator: RuleEvaluator,\n): Promise<ReviewDecision> {\n const outcome = resolveRuleDecision(ruleEvaluator(name, args), deps.approvalPolicy);\n if (outcome === \"auto_allow\") return { kind: \"approved\" };\n if (outcome === \"auto_reject\") return DENIED;\n return deps.approvalGate.request({\n type: \"permissions.request_approval\",\n requestId: newId(\"appr\"),\n summary: `tool '${name}'`,\n });\n}\n"],"mappings":"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","names":[]}