@schlenkr/ragents 0.1.8 → 0.1.9

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 (174) hide show
  1. package/apps/server/src/config-definition.ts +24 -2
  2. package/apps/server/src/config.ts +0 -6
  3. package/apps/server/src/host-api.json +3 -10
  4. package/apps/server/src/host-api.ts +6 -7
  5. package/apps/server/src/plugin-build/build.ts +28 -5
  6. package/apps/server/src/plugin-build/plugin-description.ts +1 -1
  7. package/apps/server/src/plugin-build/typecheck.ts +2 -2
  8. package/apps/server/src/plugin-support/language-server/plugin.ts +8 -7
  9. package/apps/server/src/plugin-support/language-server/tools.ts +7 -6
  10. package/apps/server/src/plugin-support/model-aliases.ts +55 -25
  11. package/apps/server/src/plugin-support/product-relay.ts +10 -2
  12. package/apps/server/src/plugin-support/workspace-sandbox-host.ts +18 -9
  13. package/apps/server/src/profile/bundle-manifest.ts +7 -3
  14. package/apps/server/src/profile/compose.ts +6 -0
  15. package/apps/server/src/profile/plugin-discovery.ts +6 -1
  16. package/apps/server/src/profile/provisioning.ts +6 -5
  17. package/apps/server/src/ragents/engine.ts +0 -1
  18. package/apps/server/src/ragents/host-services.ts +4 -0
  19. package/apps/server/src/ragents/session.ts +1 -1
  20. package/apps/server/src/server.ts +1 -0
  21. package/apps/server/tsconfig.json +2 -0
  22. package/apps/web/dist/help/guide-clients.html +14 -6
  23. package/apps/web/dist/help/guide-clients.md +14 -6
  24. package/apps/web/dist/help/guide-distributed.html +12 -4
  25. package/apps/web/dist/help/guide-distributed.md +12 -4
  26. package/apps/web/dist/help/guide-getting-started.html +12 -8
  27. package/apps/web/dist/help/guide-getting-started.md +12 -8
  28. package/apps/web/dist/help/guide-plugins.html +6 -2
  29. package/apps/web/dist/help/guide-plugins.md +6 -2
  30. package/apps/web/dist/help/guide-runtime.html +2 -1
  31. package/apps/web/dist/help/guide-runtime.md +2 -1
  32. package/apps/web/dist/help/index.html +3328 -1135
  33. package/apps/web/dist/host-web.json +3 -3
  34. package/bundles/ragents.activity/ragents-bundle.json +3 -3
  35. package/bundles/ragents.actor-programs/ragents-bundle.json +3 -3
  36. package/bundles/ragents.ask/ragents-bundle.json +4 -4
  37. package/bundles/ragents.ask/server/index.js +42 -11
  38. package/bundles/ragents.ask/server/index.js.map +3 -3
  39. package/bundles/ragents.ask/web/chunks/chunk-WFN4374U.js +2 -0
  40. package/bundles/ragents.ask/web/chunks/chunk-WFN4374U.js.map +7 -0
  41. package/bundles/ragents.ask/web/classes.json +1 -1
  42. package/bundles/ragents.ask/web/exports/ask-payload.js +1 -1
  43. package/bundles/ragents.ask/web/index.js +1 -1
  44. package/bundles/ragents.ask/web/index.js.map +3 -3
  45. package/bundles/ragents.browser/executor/index.mjs +357 -0
  46. package/bundles/ragents.browser/executor/index.mjs.map +7 -0
  47. package/bundles/ragents.browser/ragents-bundle.json +5 -8
  48. package/bundles/ragents.browser/server/chunks/{chunk-2GKLLCBE.js → chunk-CWLX4VA5.js} +1 -1
  49. package/bundles/ragents.browser/server/chunks/chunk-CWLX4VA5.js.map +7 -0
  50. package/bundles/ragents.browser/server/exports/server/contract.js +1 -1
  51. package/bundles/ragents.browser/server/index.js +20 -9
  52. package/bundles/ragents.browser/server/index.js.map +4 -4
  53. package/bundles/ragents.documents/ragents-bundle.json +3 -3
  54. package/bundles/ragents.lsp-fsharp/executor/index.mjs +68 -0
  55. package/bundles/ragents.lsp-fsharp/executor/index.mjs.map +7 -0
  56. package/bundles/ragents.lsp-fsharp/ragents-bundle.json +5 -9
  57. package/bundles/ragents.lsp-fsharp/server/index.js +21 -6
  58. package/bundles/ragents.lsp-fsharp/server/index.js.map +4 -4
  59. package/bundles/ragents.lsp-roslyn/executor/index.mjs +68 -0
  60. package/bundles/ragents.lsp-roslyn/executor/index.mjs.map +7 -0
  61. package/bundles/ragents.lsp-roslyn/ragents-bundle.json +6 -8
  62. package/bundles/ragents.lsp-roslyn/server/index.js +54 -15
  63. package/bundles/ragents.lsp-roslyn/server/index.js.map +4 -4
  64. package/bundles/ragents.lsp-typescript/executor/index.mjs +49 -0
  65. package/bundles/ragents.lsp-typescript/executor/index.mjs.map +7 -0
  66. package/bundles/ragents.lsp-typescript/ragents-bundle.json +5 -7
  67. package/bundles/ragents.lsp-typescript/server/index.js +22 -2
  68. package/bundles/ragents.lsp-typescript/server/index.js.map +3 -3
  69. package/bundles/ragents.model-relay/ragents-bundle.json +4 -4
  70. package/bundles/ragents.model-relay/server/index.js +3 -2
  71. package/bundles/ragents.model-relay/server/index.js.map +2 -2
  72. package/bundles/ragents.orchestration/ragents-bundle.json +3 -3
  73. package/bundles/ragents.overseer/ragents-bundle.json +3 -3
  74. package/bundles/ragents.processes/ragents-bundle.json +3 -3
  75. package/bundles/ragents.product/ragents-bundle.json +3 -3
  76. package/bundles/ragents.profile-distribution/ragents-bundle.json +4 -4
  77. package/bundles/ragents.profile-distribution/server/index.js +1 -1
  78. package/bundles/ragents.profile-distribution/server/index.js.map +2 -2
  79. package/bundles/ragents.reference/ragents-bundle.json +3 -3
  80. package/bundles/ragents.todo/ragents-bundle.json +3 -3
  81. package/bundles/ragents.transcript/ragents-bundle.json +3 -3
  82. package/bundles/ragents.watch/ragents-bundle.json +3 -3
  83. package/bundles/ragents.workspace/ragents-bundle.json +11 -5
  84. package/bundles/ragents.workspace/server/index.js +101 -28
  85. package/bundles/ragents.workspace/server/index.js.map +3 -3
  86. package/bundles/ragents.workspace/web/classes.json +1 -1
  87. package/bundles/ragents.workspace/web/index.js +1 -1
  88. package/bundles/ragents.workspace/web/index.js.map +3 -3
  89. package/package.json +2 -2
  90. package/packages/agent/dist/core/agent-settings.d.ts +1 -7
  91. package/packages/agent/dist/core/compaction/compaction.d.ts +17 -13
  92. package/packages/agent/dist/core/model-runtime.d.ts +5 -4
  93. package/packages/agent/dist/core/provider-composer.d.ts +2 -1
  94. package/packages/agent/dist/core/tools/bash.d.ts +9 -3
  95. package/packages/agent/dist/index.d.ts +1 -1
  96. package/packages/agent/src/core/agent-settings.ts +1 -4
  97. package/packages/agent/src/core/compaction/compaction.ts +68 -30
  98. package/packages/agent/src/core/model-runtime.ts +12 -5
  99. package/packages/agent/src/core/provider-composer.ts +5 -0
  100. package/packages/agent/src/core/tools/bash.ts +36 -30
  101. package/packages/agent/src/index.ts +3 -0
  102. package/packages/ai/dist/types.d.ts +11 -0
  103. package/packages/ai/src/types.ts +12 -0
  104. package/packages/ragents/src/domain/event-semantics.ts +3 -0
  105. package/packages/ragents/src/domain/event-validation.ts +15 -2
  106. package/packages/ragents/src/domain/events.ts +3 -0
  107. package/packages/ragents/src/domain/model.ts +2 -0
  108. package/packages/ragents/src/domain/projection.ts +1 -0
  109. package/packages/ragents/src/drivers/agent-runtime.ts +1 -1
  110. package/packages/ragents/src/drivers/agent-turn.ts +8 -6
  111. package/packages/ragents/src/runtime/decisions/inputs.ts +6 -2
  112. package/packages/ragents/src/runtime/journal-storage.ts +5 -4
  113. package/packages/workspace-executor/package.json +0 -1
  114. package/packages/workspace-executor/src/bash-launch.ts +56 -10
  115. package/packages/workspace-executor/src/context.ts +4 -0
  116. package/packages/workspace-executor/src/contributions.ts +150 -0
  117. package/packages/workspace-executor/src/executor.ts +1 -1
  118. package/packages/workspace-executor/src/index.ts +16 -19
  119. package/packages/workspace-executor/src/language-server/host.ts +3 -0
  120. package/packages/workspace-executor/src/language-server/module.ts +12 -2
  121. package/packages/workspace-executor/src/language-server/roots.ts +0 -5
  122. package/packages/workspace-executor/src/modules.ts +7 -6
  123. package/packages/workspace-executor/src/sandbox-tools.ts +3 -9
  124. package/packages/workspace-executor/src/shell-platform.ts +14 -3
  125. package/packages/workspace-executor/src/tools.ts +0 -3
  126. package/plugins/ragents.ask/ask-payload.ts +9 -0
  127. package/plugins/ragents.ask/server/ask-service.ts +53 -13
  128. package/plugins/ragents.ask/web/AskActionView.tsx +3 -2
  129. package/plugins/ragents.browser/executor/index.ts +5 -0
  130. package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/module.ts +25 -31
  131. package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/playwright.ts +9 -23
  132. package/plugins/ragents.browser/provision.ts +1 -1
  133. package/plugins/ragents.browser/server/browser.ts +3 -3
  134. package/plugins/ragents.browser/server/contract.ts +2 -2
  135. package/plugins/ragents.browser/server/index.ts +1 -1
  136. package/plugins/ragents.lsp-fsharp/executor.ts +80 -0
  137. package/plugins/ragents.lsp-fsharp/provision.ts +1 -1
  138. package/plugins/ragents.lsp-fsharp/server/index.ts +2 -2
  139. package/plugins/ragents.lsp-roslyn/executor.ts +64 -0
  140. package/plugins/ragents.lsp-roslyn/provision.ts +1 -1
  141. package/plugins/ragents.lsp-roslyn/server/index.ts +28 -5
  142. package/plugins/ragents.lsp-roslyn/server/solution-on-start.ts +18 -6
  143. package/plugins/ragents.lsp-typescript/executor.ts +50 -0
  144. package/plugins/ragents.lsp-typescript/server/index.ts +2 -2
  145. package/plugins/ragents.model-relay/server/config.ts +1 -1
  146. package/plugins/ragents.model-relay/server/relay.ts +4 -2
  147. package/plugins/ragents.profile-distribution/server/archive.ts +2 -1
  148. package/plugins/ragents.workspace/client/workspace-client.ts +111 -28
  149. package/plugins/ragents.workspace/contract.ts +33 -2
  150. package/plugins/ragents.workspace/server/binding.ts +10 -4
  151. package/plugins/ragents.workspace/server/clients.ts +56 -9
  152. package/plugins/ragents.workspace/server/config.ts +9 -0
  153. package/plugins/ragents.workspace/server/index.ts +13 -4
  154. package/plugins/ragents.workspace/server/runtime.ts +10 -0
  155. package/plugins/ragents.workspace/server/shell-platform.ts +6 -5
  156. package/plugins/ragents.workspace/web/WorkspaceBinding.tsx +1 -1
  157. package/ragents.config.core.ts +4 -1
  158. package/ragents.config.showcase.ts +4 -1
  159. package/scripts/agent/journal.ts +3 -1
  160. package/scripts/package/build-package.ts +3 -1
  161. package/scripts/provision/run-provision.ts +2 -2
  162. package/scripts/workspace-client/run-workspace-client.ts +7 -4
  163. package/apps/web/dist/help/screenshots/release-checklist-vscode.png +0 -0
  164. package/apps/web/dist/help/screenshots/release-checklist-web.png +0 -0
  165. package/bundles/ragents.ask/web/chunks/chunk-HGFDGTNC.js +0 -2
  166. package/bundles/ragents.ask/web/chunks/chunk-HGFDGTNC.js.map +0 -7
  167. package/bundles/ragents.browser/server/chunks/chunk-2GKLLCBE.js.map +0 -7
  168. package/packages/workspace-executor/src/language-server/adapters/fsharp.ts +0 -60
  169. package/packages/workspace-executor/src/language-server/adapters/index.ts +0 -7
  170. package/packages/workspace-executor/src/language-server/adapters/roslyn.ts +0 -56
  171. package/packages/workspace-executor/src/language-server/adapters/typescript.ts +0 -74
  172. package/packages/workspace-executor/src/language-server/solution.ts +0 -13
  173. /package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/contract.ts +0 -0
  174. /package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/pages.ts +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "inputs": {
3
3
  "apps/server/src/api/contracts.ts": "2703c1bfc108886e3564761d70466985cd03df64024da704b8d87cb25b8deea4",
4
- "apps/server/src/host-api.ts": "754f7741008f0c20b04a153f2043f118ccc3385dbb30e6d2934aa2f62e3e97e1",
4
+ "apps/server/src/host-api.ts": "3f1044f2b7b1031996b48268a1c7243140b978b5fd5eee2023eda537e0c3363d",
5
5
  "apps/server/src/plugin-support/actor-programs/contract.ts": "c334fd984af72a23b328da72d6154d50c68a47d6dfcca5eea10b0ed8c856389d",
6
6
  "apps/server/src/plugin-support/chat-display-contract.ts": "2fb8aab13b5a60b4fe28f87f93cc82afb34b7d8ef1463e376bc3cbc0bcdc797b",
7
7
  "apps/server/src/plugin-support/language-server/contract.ts": "b8bdf743d1801e4948d759552ff5e85812381403e42119e453dd8d8a1910eee3",
@@ -132,12 +132,12 @@
132
132
  "apps/web/vite.config.ts": "08ad5bbe43fc990ba2763e1e170970d88b3ce9c78e54c14d197d8157ad6730fa",
133
133
  "packages/ragents/src/access.ts": "59845358f669c00d42ccc78bbb21bf7a348158228ae1b4a58a76f5de5158d398",
134
134
  "packages/ragents/src/domain/actor-reference.ts": "657f18122b55dfa9ceda91f4457a8cb95b51ff301c9e79387e1fd304a22d2da2",
135
- "packages/ragents/src/domain/events.ts": "9d1a2a96a10e4069191de893ea5e0c689829b43ff64107474a15d0153ee48aff",
135
+ "packages/ragents/src/domain/events.ts": "4e3d629f5e33f23db6e2de655e74517189974a26cb09f462ef349546f72166aa",
136
136
  "packages/ragents/src/http/contracts.ts": "0f85568de2d470dc2815497abd2ae5eef88e5f282cdeaad40dd67990e0fb0cdf",
137
137
  "packages/ragents/src/rpc/contract.ts": "83edcfb3492dc78239a9344cbaa822dee1d9c13b5f83fe8303c27790c83594e7",
138
138
  "packages/ragents/src/rpc/peer.ts": "9c4ace7084f93194e12bacc2865ec3430c10a9236630d84d723d3bab58672c84",
139
139
  "packages/ragents/src/rpc/protocol.ts": "02e58cac59a66067550f384cf33bbdf6a10bf67055d8e2d33ed0fd07e247f09e",
140
140
  "packages/ragents/src/runtime/domain-error.ts": "d6bf8fa09769c4137e616c83a84cb9c05a58bfa6c2e32c9404a1c202815837a4",
141
- "pnpm-lock.yaml": "2079e15f5a6472d3474e1ab9279a0499ca4a75906ce542d6271ad0220c7cb9ab"
141
+ "pnpm-lock.yaml": "1329ffcce5282562231dd465ec937200ba3b621a26e95963dfa7aa377989fc34"
142
142
  }
143
143
  }
@@ -1,7 +1,7 @@
1
1
  {
2
- "format": 3,
2
+ "format": 4,
3
3
  "id": "ragents.activity",
4
- "api": 6,
4
+ "api": 7,
5
5
  "hostNames": {
6
6
  "server": {},
7
7
  "web": {
@@ -23,7 +23,7 @@
23
23
  }
24
24
  },
25
25
  "stand": "76950227a2595ee5aa386c266cfe5a251b86943efffeda64a971b986ae33faec",
26
- "sourceStand": "9f49ba186c2e5bc78cdee4402a8e004b6181e518fd968a3439f095380a8aaba5",
26
+ "sourceStand": "343faff41933681d18ac632eff6e1971ae0e034130635b66466edc8e7c6b2031",
27
27
  "server": "server/index.js",
28
28
  "web": {
29
29
  "entry": "web/index.js",
@@ -1,7 +1,7 @@
1
1
  {
2
- "format": 3,
2
+ "format": 4,
3
3
  "id": "ragents.actor-programs",
4
- "api": 6,
4
+ "api": 7,
5
5
  "hostNames": {
6
6
  "server": {
7
7
  "@ragents/engine": [
@@ -193,7 +193,7 @@
193
193
  }
194
194
  },
195
195
  "stand": "7519e19c958a5f4821bff72f212fc3c8d5b7f7e8ac00195d57c5525beb4bab04",
196
- "sourceStand": "51b005bf98c8009758fe4b4c07d0ddbeba5f3b9fb29298993d3840cb168ecf54",
196
+ "sourceStand": "32bb8100fc46a1d1f317833efb2f6f396bc6553081f01cdf6bf102eb7c3e9f7e",
197
197
  "server": "server/index.js",
198
198
  "web": {
199
199
  "entry": "web/index.js",
@@ -1,7 +1,7 @@
1
1
  {
2
- "format": 3,
2
+ "format": 4,
3
3
  "id": "ragents.ask",
4
- "api": 6,
4
+ "api": 7,
5
5
  "hostNames": {
6
6
  "server": {
7
7
  "@ragents/engine": [
@@ -73,8 +73,8 @@
73
73
  ]
74
74
  }
75
75
  },
76
- "stand": "bfcbef3ac8061d0414592043532059dfb3087e9f1e4fc2bbc8f12b66060a96ce",
77
- "sourceStand": "f8a0da2327b506d345b997f75a849fc1b3adb7db2c774222370f5692a27b0e1c",
76
+ "stand": "0c13aeadc67e74c8e07ec3f547f2a5e56c9cd807d2259d874382b6309c0f902a",
77
+ "sourceStand": "ffa758a97707149a471be3345b2ab0cf5ef17cef8dd8149978f62b8ce9485802",
78
78
  "server": "server/index.js",
79
79
  "web": {
80
80
  "entry": "web/index.js",
@@ -50,6 +50,7 @@ import {
50
50
 
51
51
  // ask-payload.ts
52
52
  var ASK_PLUGIN_ID = "ragents.ask";
53
+ var SUPERSEDED_ANSWER = "Not answered: the user sent a new message instead.";
53
54
  var stringArrayOf = (value) => Array.isArray(value) && value.every((entry) => typeof entry === "string") ? [...value] : void 0;
54
55
  var askPayloadOf = (payload) => {
55
56
  if (typeof payload !== "object" || payload === null) return void 0;
@@ -63,10 +64,16 @@ var askPayloadOf = (payload) => {
63
64
  ...typeof candidate.recipient === "string" ? { recipient: candidate.recipient } : {}
64
65
  };
65
66
  };
67
+ var supersedingInputOf = (result) => {
68
+ if (typeof result !== "object" || result === null) return void 0;
69
+ const { supersededBy } = result;
70
+ return typeof supersededBy === "string" ? supersededBy : void 0;
71
+ };
66
72
 
67
73
  // server/ask-service.ts
68
- var answerOf = (decision, result) => decision !== "approved" ? DISMISSED_ANSWER : typeof result === "string" ? result : result === null || result === void 0 ? "" : JSON.stringify(result);
74
+ var answerOf = (decision, result) => decision !== "approved" ? supersedingInputOf(result) === void 0 ? DISMISSED_ANSWER : SUPERSEDED_ANSWER : typeof result === "string" ? result : result === null || result === void 0 ? "" : JSON.stringify(result);
69
75
  var resolvedAnswerOf = (action) => action.status === "pending" ? null : answerOf(action.status, action.result);
76
+ var humanInputPendingFor = (runtime, runId, actorId) => [...runtime.state(runId).inputs.values()].some((input) => input.actorId === actorId && input.origin === "human" && input.lifecycle.kind === "pending");
70
77
  var RuntimeAskService = class {
71
78
  #runtime;
72
79
  #waiters = /* @__PURE__ */ new Map();
@@ -78,6 +85,7 @@ var RuntimeAskService = class {
78
85
  }
79
86
  ask(call, request, signal) {
80
87
  const runtime = this.#requireRuntime();
88
+ if (call.turnId && humanInputPendingFor(runtime, call.runId, call.agentId)) return Promise.resolve(SUPERSEDED_ANSWER);
81
89
  const context = {
82
90
  actorId: call.agentId,
83
91
  commandId: call.commandId,
@@ -100,7 +108,7 @@ var RuntimeAskService = class {
100
108
  if (proposed?.type !== "action.proposed") {
101
109
  throw new Error(`Die Frage von ${call.agentId} wurde nicht im Journal von ${call.runId} angelegt`);
102
110
  }
103
- return this.#awaitAnswer(call.runId, proposed.payload.actionId, signal);
111
+ return this.#awaitAnswer(call.runId, proposed.payload.actionId, call.turnId ? call.agentId : null, signal);
104
112
  }
105
113
  answer(runId, actionId, input) {
106
114
  const runtime = this.#requireRuntime();
@@ -117,6 +125,16 @@ var RuntimeAskService = class {
117
125
  );
118
126
  }
119
127
  withdraw(runId, actionId) {
128
+ this.#dismiss(runId, actionId, "ask-withdraw", null, DISMISSED_ANSWER);
129
+ }
130
+ #supersede(runId, actionId, inputId) {
131
+ try {
132
+ this.#dismiss(runId, actionId, "ask-supersede", { supersededBy: inputId }, SUPERSEDED_ANSWER);
133
+ } catch (error) {
134
+ console.error(`Question ${actionId} could not be closed for message ${inputId}: ${error instanceof Error ? error.message : String(error)}`);
135
+ }
136
+ }
137
+ #dismiss(runId, actionId, commandPrefix, result, answer) {
120
138
  const runtime = this.#requireRuntime();
121
139
  const state = runtime.state(runId);
122
140
  const action = state.actions.get(actionId);
@@ -124,17 +142,17 @@ var RuntimeAskService = class {
124
142
  this.#aborting.add(actionId);
125
143
  try {
126
144
  runtime.resolveAction(
127
- { actorId: state.ownerId, commandId: `ask-withdraw:${actionId}:${randomUUID()}` },
145
+ { actorId: state.ownerId, commandId: `${commandPrefix}:${actionId}:${randomUUID()}` },
128
146
  runId,
129
147
  actionId,
130
- { decision: "dismissed", result: null }
148
+ { decision: "dismissed", result }
131
149
  );
132
150
  } finally {
133
151
  this.#aborting.delete(actionId);
134
152
  }
135
- this.#waiters.get(actionId)?.(DISMISSED_ANSWER);
153
+ this.#waiters.get(actionId)?.settle(answer);
136
154
  }
137
- #awaitAnswer(runId, actionId, signal) {
155
+ #awaitAnswer(runId, actionId, blockedActorId, signal) {
138
156
  const runtime = this.#requireRuntime();
139
157
  const action = runtime.state(runId).actions.get(actionId);
140
158
  if (!action) throw new Error(`Frage ${actionId} existiert nicht in Run ${runId}`);
@@ -167,15 +185,28 @@ var RuntimeAskService = class {
167
185
  return;
168
186
  }
169
187
  signal?.addEventListener("abort", abort, { once: true });
170
- this.#waiters.set(actionId, (answer) => {
171
- signal?.removeEventListener("abort", abort);
172
- this.#waiters.delete(actionId);
173
- resolve(answer);
188
+ this.#waiters.set(actionId, {
189
+ runId,
190
+ blockedActorId,
191
+ settle: (answer) => {
192
+ signal?.removeEventListener("abort", abort);
193
+ this.#waiters.delete(actionId);
194
+ resolve(answer);
195
+ }
174
196
  });
175
197
  });
176
198
  }
177
199
  #onJournal(events) {
178
200
  for (const event of events) {
201
+ if (event.type === "actor.input.enqueued") {
202
+ if (event.payload.origin !== "human") continue;
203
+ const { actorId, inputId } = event.payload;
204
+ for (const [actionId, waiter2] of this.#waiters) {
205
+ if (waiter2.runId !== event.runId || waiter2.blockedActorId !== actorId) continue;
206
+ queueMicrotask(() => this.#supersede(event.runId, actionId, inputId));
207
+ }
208
+ continue;
209
+ }
179
210
  if (event.type !== "action.resolved") continue;
180
211
  if (this.#aborting.has(event.payload.actionId)) continue;
181
212
  const resolved = this.#requireRuntime().state(event.runId).actions.get(event.payload.actionId);
@@ -183,7 +214,7 @@ var RuntimeAskService = class {
183
214
  const answer = answerOf(event.payload.decision, event.payload.result);
184
215
  const waiter = this.#waiters.get(event.payload.actionId);
185
216
  if (waiter) {
186
- waiter(answer);
217
+ waiter.settle(answer);
187
218
  continue;
188
219
  }
189
220
  queueMicrotask(() => this.#enqueueAnswer(event.runId, event.payload.actionId, answer));
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../plugins/ragents.ask/server/index.ts", "../../../plugins/ragents.ask/server/answer-method.ts", "../../../plugins/ragents.ask/contract.ts", "../../../plugins/ragents.ask/server/ask-service.ts", "../../../plugins/ragents.ask/ask-payload.ts", "../../../plugins/ragents.ask/server/tool-contributor.ts", "../../../plugins/ragents.ask/server/ask-tool.ts"],
4
- "sourcesContent": ["import type { RAgentsPlugin } from \"@ragents/engine\";\nimport { pluginAsset } from \"@ragents/host/plugin-support/plugin-folder.js\";\nimport type { PluginModule } from \"@ragents/host/plugin-support/plugin-module.js\";\nimport { handlebarsPrompt } from \"@ragents/host/plugin-support/prompt.js\";\nimport { runGuardToken } from \"@ragents/host/ragents/host-services.js\";\nimport { runtimeBridgeToken } from \"@ragents/host/ragents/runtime-bridge.js\";\nimport { createAnswerMethod } from \"./answer-method.js\";\nimport { RuntimeAskService } from \"./ask-service.js\";\nimport { askServiceToken } from \"./contract.js\";\nimport { createAskToolContributor } from \"./tool-contributor.js\";\n\nconst askPlugin: RAgentsPlugin = {\n manifest: { id: \"ragents.ask\" },\n register: (host) => {\n const service = new RuntimeAskService();\n host.provide(askServiceToken, service);\n host.provide(runtimeBridgeToken, { bind: (runtime) => service.bind(runtime) });\n host.prompts(handlebarsPrompt(\"ragents.ask.prompt\", 480, pluginAsset(\"ragents.ask\", \"ask.hbs\")));\n host.functions(createAskToolContributor(service));\n host.methods(createAnswerMethod(service, host.service(runGuardToken)));\n },\n};\n\nexport const plugin: PluginModule = { create: () => askPlugin };\n", "import { DomainError, implement, type MethodContribution } from \"@ragents/engine\";\nimport { askContracts } from \"../contract.js\";\nimport type { RuntimeAskService } from \"./ask-service.js\";\n\nexport const createAnswerMethod = (\n service: RuntimeAskService,\n ensureSession: (runId: string) => void,\n): MethodContribution => implement(askContracts.answer, ({ runId, actionId, answer, dismiss }) => {\n if (dismiss !== true && (typeof answer !== \"string\" || answer.trim() === \"\")) {\n throw new DomainError(\"answer-missing\", \"answer ist erforderlich, wenn nicht verworfen wird\", 400);\n }\n ensureSession(runId);\n service.answer(runId, actionId, { ...(answer !== undefined ? { answer } : {}), ...(dismiss !== undefined ? { dismiss } : {}) });\n return null;\n});\n", "import { Type } from \"typebox\";\nimport { defineOperation } from \"@ragents/engine/src/rpc/contract\";\n\nexport const askContracts = {\n answer: defineOperation({\n id: \"ragents.ask.answer\",\n description: \"Eine R\u00FCckfrage des Runs beantworten oder verwerfen. Rechte: runs.read und runs.write.\",\n rights: [\"runs.read\", \"runs.write\"],\n input: Type.Object({\n runId: Type.String({ minLength: 1, maxLength: 64, description: \"Kennung des Runs\" }),\n actionId: Type.String({ minLength: 1, maxLength: 80, description: \"Kennung der Frage\" }),\n answer: Type.Optional(Type.String({ description: \"Die Antwort des Benutzers\" })),\n dismiss: Type.Optional(Type.Boolean({ description: \"true verwirft die Frage ohne Antwort\" })),\n }, { additionalProperties: false }),\n result: Type.Null(),\n }),\n};\n", "import { randomUUID } from \"node:crypto\";\nimport {\n DomainError,\n type Action,\n type CommandContext,\n type JournalEvent,\n type Orchestration,\n} from \"@ragents/engine\";\nimport { askPayloadOf, ASK_PLUGIN_ID } from \"../ask-payload.js\";\nimport { DISMISSED_ANSWER, type AskCall, type AskRequest, type AskService } from \"./contract.js\";\n\nconst answerOf = (decision: \"approved\" | \"dismissed\", result: unknown): string =>\n decision !== \"approved\" ? DISMISSED_ANSWER : typeof result === \"string\" ? result : result === null || result === undefined ? \"\" : JSON.stringify(result);\n\nconst resolvedAnswerOf = (action: Action): string | null =>\n action.status === \"pending\" ? null : answerOf(action.status, action.result);\n\nexport class RuntimeAskService implements AskService {\n #runtime: Orchestration | undefined;\n readonly #waiters = new Map<string, (answer: string) => void>();\n readonly #aborting = new Set<string>();\n\n bind(runtime: Orchestration): void {\n if (this.#runtime) throw new Error(\"Der Ask-Service wurde bereits an eine Runtime gebunden\");\n this.#runtime = runtime;\n runtime.subscribe((events) => this.#onJournal(events));\n }\n\n ask(call: AskCall, request: AskRequest, signal: AbortSignal | undefined): Promise<string> {\n const runtime = this.#requireRuntime();\n const context: CommandContext = {\n actorId: call.agentId,\n commandId: call.commandId,\n ...(call.turnId ? { turnId: call.turnId, correlationId: call.turnId, causationId: call.turnId } : {}),\n };\n runtime.proposeAction(context, call.runId, {\n owner: ASK_PLUGIN_ID,\n title: request.question,\n description: request.description,\n parameters: request.parameters,\n input: { label: \"Antwort\", placeholder: null, required: true },\n payload: {\n question: request.question,\n options: [...request.options],\n multi: request.multi === true,\n ...(request.recipient ? { recipient: request.recipient } : {}),\n },\n });\n const proposed = runtime.events(call.runId).find((event) =>\n event.type === \"action.proposed\" && event.commandId === call.commandId);\n if (proposed?.type !== \"action.proposed\") {\n throw new Error(`Die Frage von ${call.agentId} wurde nicht im Journal von ${call.runId} angelegt`);\n }\n return this.#awaitAnswer(call.runId, proposed.payload.actionId, signal);\n }\n\n answer(runId: string, actionId: string, input: { answer?: string; dismiss?: boolean }): void {\n const runtime = this.#requireRuntime();\n const state = runtime.state(runId);\n const action = state.actions.get(actionId);\n if (!action || action.owner !== ASK_PLUGIN_ID) {\n throw new DomainError(\"question-not-found\", `Frage ${actionId} existiert nicht in Run ${runId}.`, 404);\n }\n runtime.resolveAction(\n { actorId: state.ownerId, commandId: `ask-answer:${actionId}:${randomUUID()}` },\n runId,\n actionId,\n input.dismiss === true\n ? { decision: \"dismissed\", result: null }\n : { decision: \"approved\", result: input.answer ?? null },\n );\n }\n\n withdraw(runId: string, actionId: string): void {\n const runtime = this.#requireRuntime();\n const state = runtime.state(runId);\n const action = state.actions.get(actionId);\n if (action?.owner !== ASK_PLUGIN_ID || action.status !== \"pending\") return;\n this.#aborting.add(actionId);\n try {\n runtime.resolveAction(\n { actorId: state.ownerId, commandId: `ask-withdraw:${actionId}:${randomUUID()}` },\n runId,\n actionId,\n { decision: \"dismissed\", result: null },\n );\n } finally {\n this.#aborting.delete(actionId);\n }\n this.#waiters.get(actionId)?.(DISMISSED_ANSWER);\n }\n\n #awaitAnswer(runId: string, actionId: string, signal: AbortSignal | undefined): Promise<string> {\n const runtime = this.#requireRuntime();\n const action = runtime.state(runId).actions.get(actionId);\n if (!action) throw new Error(`Frage ${actionId} existiert nicht in Run ${runId}`);\n const settled = resolvedAnswerOf(action);\n if (settled !== null) return Promise.resolve(settled);\n return new Promise<string>((resolve, reject) => {\n const abort = () => {\n this.#waiters.delete(actionId);\n this.#aborting.add(actionId);\n try {\n const state = runtime.state(runId);\n const pending = state.actions.get(actionId);\n if (pending?.status === \"pending\") {\n runtime.resolveAction(\n { actorId: state.ownerId, commandId: `ask-abort:${actionId}:${randomUUID()}` },\n runId,\n actionId,\n { decision: \"dismissed\", result: null },\n );\n }\n reject(new Error(\"Das Warten auf die Antwort wurde abgebrochen.\"));\n } catch (error) {\n reject(error);\n } finally {\n this.#aborting.delete(actionId);\n }\n };\n if (signal?.aborted) {\n abort();\n return;\n }\n signal?.addEventListener(\"abort\", abort, { once: true });\n this.#waiters.set(actionId, (answer) => {\n signal?.removeEventListener(\"abort\", abort);\n this.#waiters.delete(actionId);\n resolve(answer);\n });\n });\n }\n\n #onJournal(events: JournalEvent[]): void {\n for (const event of events) {\n if (event.type !== \"action.resolved\") continue;\n if (this.#aborting.has(event.payload.actionId)) continue;\n const resolved = this.#requireRuntime().state(event.runId).actions.get(event.payload.actionId);\n if (resolved?.owner !== ASK_PLUGIN_ID) continue;\n const answer = answerOf(event.payload.decision, event.payload.result);\n const waiter = this.#waiters.get(event.payload.actionId);\n if (waiter) {\n waiter(answer);\n continue;\n }\n queueMicrotask(() => this.#enqueueAnswer(event.runId, event.payload.actionId, answer));\n }\n }\n\n #enqueueAnswer(runId: string, actionId: string, answer: string): void {\n try {\n const runtime = this.#requireRuntime();\n const state = runtime.state(runId);\n const action = state.actions.get(actionId);\n if (!action) return;\n const recipientId = askPayloadOf(action.payload)?.recipient ?? action.askedBy;\n const recipient = state.actors.get(recipientId);\n if (!recipient || recipient.kind === \"human\" || recipient.lifecycle.kind === \"stopped\") return;\n runtime.enqueueInput(\n { actorId: state.ownerId, commandId: `ask-input:${actionId}` },\n runId,\n {\n actorId: recipientId,\n content: `Antwort auf ${recipientId === action.askedBy ? \"deine Frage\" : \"die Frage\"}: ${action.title}\\nAntwort: ${answer}`,\n },\n );\n } catch (error) {\n console.error(`Antwort auf Frage ${actionId} konnte nicht als Input eingereiht werden: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n #requireRuntime(): Orchestration {\n if (!this.#runtime) throw new Error(\"Der Ask-Service ist noch nicht an die Runtime gebunden\");\n return this.#runtime;\n }\n}\n", "export const ASK_PLUGIN_ID = \"ragents.ask\";\n\nexport interface AskPayload {\n question: string;\n options: string[];\n multi: boolean;\n /** Der Actor, f\u00FCr den die Frage steht, wenn der Eigent\u00FCmer des Runs sie au\u00DFerhalb eines Turns stellt. */\n recipient?: string;\n}\n\nconst stringArrayOf = (value: unknown): string[] | undefined =>\n Array.isArray(value) && value.every((entry) => typeof entry === \"string\") ? [...value] : undefined;\n\nexport const askPayloadOf = (payload: unknown): AskPayload | undefined => {\n if (typeof payload !== \"object\" || payload === null) return undefined;\n const candidate = payload as Partial<AskPayload>;\n const options = stringArrayOf(candidate.options);\n if (typeof candidate.question !== \"string\" || !options) return undefined;\n return {\n question: candidate.question,\n options,\n multi: candidate.multi === true,\n ...(typeof candidate.recipient === \"string\" ? { recipient: candidate.recipient } : {}),\n };\n};\n", "import type { ToolContributor } from \"@ragents/engine\";\nimport { toolDescriptorFrom } from \"@ragents/host/plugin-support/agent-tool.js\";\nimport { facesOperator } from \"@ragents/host/plugin-support/tool-availability.js\";\nimport { askToolMetadata, createAskTool } from \"./ask-tool.js\";\nimport type { AskService } from \"./contract.js\";\n\nexport const createAskToolContributor = (service: AskService): ToolContributor => ({\n name: \"ragents.ask\",\n descriptors: [toolDescriptorFrom(askToolMetadata, facesOperator)],\n tools: () => [createAskTool(service)],\n});\n", "import { Type } from \"typebox\";\nimport { defineRunFunction, type RunFunction } from \"@ragents/engine\";\nimport { facesOperator } from \"@ragents/host/plugin-support/tool-availability.js\";\nimport type { AskService } from \"./contract.js\";\n\nexport const askToolMetadata = {\n name: \"ask_user\",\n label: \"R\u00FCckfrage\",\n description: \"Holt eine n\u00F6tige Benutzerentscheidung mit Antwortoptionen ein und wartet auf die Antwort.\",\n longDescription: \"Nutze dieses Werkzeug immer, wenn du eine Entscheidung des Benutzers brauchst \"\n + \"(z.B. Auswahl eines Branches oder eines Zeitraums), statt die Frage nur als Text zu stellen. \"\n + \"Mit multi=true darf der Benutzer mehrere Optionen w\u00E4hlen; die Antwort ist dann mit '; ' verbunden. \"\n + \"Der Benutzer kann statt einer Option auch immer frei antworten - rechne also damit, \"\n + \"dass die Antwort beliebiger Text sein kann.\",\n} as const;\n\nexport const createAskTool = (service: AskService): RunFunction =>\n defineRunFunction({\n ...askToolMetadata,\n schema: Type.Object({\n question: Type.String({ description: \"Die Frage an den Benutzer, kurz und konkret\" }),\n options: Type.Array(Type.String(), { description: \"Antwortoptionen (2 bis 6 St\u00FCck)\" }),\n multi: Type.Optional(Type.Boolean({ description: \"true = Mehrfachauswahl erlaubt\" })),\n }),\n resultSchema: Type.String(),\n available: facesOperator,\n executionMode: \"sequential\",\n run: (scope, toolCallId, input) =>\n service.ask(\n {\n runId: scope.caller.runId,\n agentId: scope.caller.actorId,\n turnId: scope.caller.turnId,\n commandId: scope.context(toolCallId).commandId,\n },\n { question: input.question, options: input.options, multi: input.multi === true },\n scope.signal,\n ),\n });\n"],
5
- "mappings": "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",
6
- "names": ["DomainError", "DomainError", "facesOperator", "Type", "facesOperator"]
4
+ "sourcesContent": ["import type { RAgentsPlugin } from \"@ragents/engine\";\nimport { pluginAsset } from \"@ragents/host/plugin-support/plugin-folder.js\";\nimport type { PluginModule } from \"@ragents/host/plugin-support/plugin-module.js\";\nimport { handlebarsPrompt } from \"@ragents/host/plugin-support/prompt.js\";\nimport { runGuardToken } from \"@ragents/host/ragents/host-services.js\";\nimport { runtimeBridgeToken } from \"@ragents/host/ragents/runtime-bridge.js\";\nimport { createAnswerMethod } from \"./answer-method.js\";\nimport { RuntimeAskService } from \"./ask-service.js\";\nimport { askServiceToken } from \"./contract.js\";\nimport { createAskToolContributor } from \"./tool-contributor.js\";\n\nconst askPlugin: RAgentsPlugin = {\n manifest: { id: \"ragents.ask\" },\n register: (host) => {\n const service = new RuntimeAskService();\n host.provide(askServiceToken, service);\n host.provide(runtimeBridgeToken, { bind: (runtime) => service.bind(runtime) });\n host.prompts(handlebarsPrompt(\"ragents.ask.prompt\", 480, pluginAsset(\"ragents.ask\", \"ask.hbs\")));\n host.functions(createAskToolContributor(service));\n host.methods(createAnswerMethod(service, host.service(runGuardToken)));\n },\n};\n\nexport const plugin: PluginModule = { create: () => askPlugin };\n", "import { DomainError, implement, type MethodContribution } from \"@ragents/engine\";\nimport { askContracts } from \"../contract.js\";\nimport type { RuntimeAskService } from \"./ask-service.js\";\n\nexport const createAnswerMethod = (\n service: RuntimeAskService,\n ensureSession: (runId: string) => void,\n): MethodContribution => implement(askContracts.answer, ({ runId, actionId, answer, dismiss }) => {\n if (dismiss !== true && (typeof answer !== \"string\" || answer.trim() === \"\")) {\n throw new DomainError(\"answer-missing\", \"answer ist erforderlich, wenn nicht verworfen wird\", 400);\n }\n ensureSession(runId);\n service.answer(runId, actionId, { ...(answer !== undefined ? { answer } : {}), ...(dismiss !== undefined ? { dismiss } : {}) });\n return null;\n});\n", "import { Type } from \"typebox\";\nimport { defineOperation } from \"@ragents/engine/src/rpc/contract\";\n\nexport const askContracts = {\n answer: defineOperation({\n id: \"ragents.ask.answer\",\n description: \"Eine R\u00FCckfrage des Runs beantworten oder verwerfen. Rechte: runs.read und runs.write.\",\n rights: [\"runs.read\", \"runs.write\"],\n input: Type.Object({\n runId: Type.String({ minLength: 1, maxLength: 64, description: \"Kennung des Runs\" }),\n actionId: Type.String({ minLength: 1, maxLength: 80, description: \"Kennung der Frage\" }),\n answer: Type.Optional(Type.String({ description: \"Die Antwort des Benutzers\" })),\n dismiss: Type.Optional(Type.Boolean({ description: \"true verwirft die Frage ohne Antwort\" })),\n }, { additionalProperties: false }),\n result: Type.Null(),\n }),\n};\n", "import { randomUUID } from \"node:crypto\";\nimport {\n DomainError,\n type Action,\n type CommandContext,\n type JournalEvent,\n type JsonValue,\n type Orchestration,\n} from \"@ragents/engine\";\nimport { askPayloadOf, ASK_PLUGIN_ID, SUPERSEDED_ANSWER, supersedingInputOf } from \"../ask-payload.js\";\nimport { DISMISSED_ANSWER, type AskCall, type AskRequest, type AskService } from \"./contract.js\";\n\nconst answerOf = (decision: \"approved\" | \"dismissed\", result: unknown): string =>\n decision !== \"approved\"\n ? supersedingInputOf(result) === undefined ? DISMISSED_ANSWER : SUPERSEDED_ANSWER\n : typeof result === \"string\" ? result : result === null || result === undefined ? \"\" : JSON.stringify(result);\n\nconst resolvedAnswerOf = (action: Action): string | null =>\n action.status === \"pending\" ? null : answerOf(action.status, action.result);\n\nconst humanInputPendingFor = (runtime: Orchestration, runId: string, actorId: string): boolean =>\n [...runtime.state(runId).inputs.values()].some((input) =>\n input.actorId === actorId && input.origin === \"human\" && input.lifecycle.kind === \"pending\");\n\ninterface Waiter {\n runId: string;\n /** The actor whose running turn waits for the answer; null for a question asked outside a turn. */\n blockedActorId: string | null;\n settle: (answer: string) => void;\n}\n\nexport class RuntimeAskService implements AskService {\n #runtime: Orchestration | undefined;\n readonly #waiters = new Map<string, Waiter>();\n readonly #aborting = new Set<string>();\n\n bind(runtime: Orchestration): void {\n if (this.#runtime) throw new Error(\"Der Ask-Service wurde bereits an eine Runtime gebunden\");\n this.#runtime = runtime;\n runtime.subscribe((events) => this.#onJournal(events));\n }\n\n ask(call: AskCall, request: AskRequest, signal: AbortSignal | undefined): Promise<string> {\n const runtime = this.#requireRuntime();\n if (call.turnId && humanInputPendingFor(runtime, call.runId, call.agentId)) return Promise.resolve(SUPERSEDED_ANSWER);\n const context: CommandContext = {\n actorId: call.agentId,\n commandId: call.commandId,\n ...(call.turnId ? { turnId: call.turnId, correlationId: call.turnId, causationId: call.turnId } : {}),\n };\n runtime.proposeAction(context, call.runId, {\n owner: ASK_PLUGIN_ID,\n title: request.question,\n description: request.description,\n parameters: request.parameters,\n input: { label: \"Antwort\", placeholder: null, required: true },\n payload: {\n question: request.question,\n options: [...request.options],\n multi: request.multi === true,\n ...(request.recipient ? { recipient: request.recipient } : {}),\n },\n });\n const proposed = runtime.events(call.runId).find((event) =>\n event.type === \"action.proposed\" && event.commandId === call.commandId);\n if (proposed?.type !== \"action.proposed\") {\n throw new Error(`Die Frage von ${call.agentId} wurde nicht im Journal von ${call.runId} angelegt`);\n }\n return this.#awaitAnswer(call.runId, proposed.payload.actionId, call.turnId ? call.agentId : null, signal);\n }\n\n answer(runId: string, actionId: string, input: { answer?: string; dismiss?: boolean }): void {\n const runtime = this.#requireRuntime();\n const state = runtime.state(runId);\n const action = state.actions.get(actionId);\n if (!action || action.owner !== ASK_PLUGIN_ID) {\n throw new DomainError(\"question-not-found\", `Frage ${actionId} existiert nicht in Run ${runId}.`, 404);\n }\n runtime.resolveAction(\n { actorId: state.ownerId, commandId: `ask-answer:${actionId}:${randomUUID()}` },\n runId,\n actionId,\n input.dismiss === true\n ? { decision: \"dismissed\", result: null }\n : { decision: \"approved\", result: input.answer ?? null },\n );\n }\n\n withdraw(runId: string, actionId: string): void {\n this.#dismiss(runId, actionId, \"ask-withdraw\", null, DISMISSED_ANSWER);\n }\n\n #supersede(runId: string, actionId: string, inputId: string): void {\n try {\n this.#dismiss(runId, actionId, \"ask-supersede\", { supersededBy: inputId }, SUPERSEDED_ANSWER);\n } catch (error) {\n console.error(`Question ${actionId} could not be closed for message ${inputId}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n #dismiss(runId: string, actionId: string, commandPrefix: string, result: JsonValue, answer: string): void {\n const runtime = this.#requireRuntime();\n const state = runtime.state(runId);\n const action = state.actions.get(actionId);\n if (action?.owner !== ASK_PLUGIN_ID || action.status !== \"pending\") return;\n this.#aborting.add(actionId);\n try {\n runtime.resolveAction(\n { actorId: state.ownerId, commandId: `${commandPrefix}:${actionId}:${randomUUID()}` },\n runId,\n actionId,\n { decision: \"dismissed\", result },\n );\n } finally {\n this.#aborting.delete(actionId);\n }\n this.#waiters.get(actionId)?.settle(answer);\n }\n\n #awaitAnswer(runId: string, actionId: string, blockedActorId: string | null, signal: AbortSignal | undefined): Promise<string> {\n const runtime = this.#requireRuntime();\n const action = runtime.state(runId).actions.get(actionId);\n if (!action) throw new Error(`Frage ${actionId} existiert nicht in Run ${runId}`);\n const settled = resolvedAnswerOf(action);\n if (settled !== null) return Promise.resolve(settled);\n return new Promise<string>((resolve, reject) => {\n const abort = () => {\n this.#waiters.delete(actionId);\n this.#aborting.add(actionId);\n try {\n const state = runtime.state(runId);\n const pending = state.actions.get(actionId);\n if (pending?.status === \"pending\") {\n runtime.resolveAction(\n { actorId: state.ownerId, commandId: `ask-abort:${actionId}:${randomUUID()}` },\n runId,\n actionId,\n { decision: \"dismissed\", result: null },\n );\n }\n reject(new Error(\"Das Warten auf die Antwort wurde abgebrochen.\"));\n } catch (error) {\n reject(error);\n } finally {\n this.#aborting.delete(actionId);\n }\n };\n if (signal?.aborted) {\n abort();\n return;\n }\n signal?.addEventListener(\"abort\", abort, { once: true });\n this.#waiters.set(actionId, {\n runId,\n blockedActorId,\n settle: (answer) => {\n signal?.removeEventListener(\"abort\", abort);\n this.#waiters.delete(actionId);\n resolve(answer);\n },\n });\n });\n }\n\n #onJournal(events: JournalEvent[]): void {\n for (const event of events) {\n if (event.type === \"actor.input.enqueued\") {\n if (event.payload.origin !== \"human\") continue;\n const { actorId, inputId } = event.payload;\n for (const [actionId, waiter] of this.#waiters) {\n if (waiter.runId !== event.runId || waiter.blockedActorId !== actorId) continue;\n queueMicrotask(() => this.#supersede(event.runId, actionId, inputId));\n }\n continue;\n }\n if (event.type !== \"action.resolved\") continue;\n if (this.#aborting.has(event.payload.actionId)) continue;\n const resolved = this.#requireRuntime().state(event.runId).actions.get(event.payload.actionId);\n if (resolved?.owner !== ASK_PLUGIN_ID) continue;\n const answer = answerOf(event.payload.decision, event.payload.result);\n const waiter = this.#waiters.get(event.payload.actionId);\n if (waiter) {\n waiter.settle(answer);\n continue;\n }\n queueMicrotask(() => this.#enqueueAnswer(event.runId, event.payload.actionId, answer));\n }\n }\n\n #enqueueAnswer(runId: string, actionId: string, answer: string): void {\n try {\n const runtime = this.#requireRuntime();\n const state = runtime.state(runId);\n const action = state.actions.get(actionId);\n if (!action) return;\n const recipientId = askPayloadOf(action.payload)?.recipient ?? action.askedBy;\n const recipient = state.actors.get(recipientId);\n if (!recipient || recipient.kind === \"human\" || recipient.lifecycle.kind === \"stopped\") return;\n runtime.enqueueInput(\n { actorId: state.ownerId, commandId: `ask-input:${actionId}` },\n runId,\n {\n actorId: recipientId,\n content: `Antwort auf ${recipientId === action.askedBy ? \"deine Frage\" : \"die Frage\"}: ${action.title}\\nAntwort: ${answer}`,\n },\n );\n } catch (error) {\n console.error(`Antwort auf Frage ${actionId} konnte nicht als Input eingereiht werden: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n #requireRuntime(): Orchestration {\n if (!this.#runtime) throw new Error(\"Der Ask-Service ist noch nicht an die Runtime gebunden\");\n return this.#runtime;\n }\n}\n", "export const ASK_PLUGIN_ID = \"ragents.ask\";\n\n/** What the asking tool call gets when a person's message to the asker closes its question. */\nexport const SUPERSEDED_ANSWER = \"Not answered: the user sent a new message instead.\";\n\nexport interface AskPayload {\n question: string;\n options: string[];\n multi: boolean;\n /** Der Actor, f\u00FCr den die Frage steht, wenn der Eigent\u00FCmer des Runs sie au\u00DFerhalb eines Turns stellt. */\n recipient?: string;\n}\n\nconst stringArrayOf = (value: unknown): string[] | undefined =>\n Array.isArray(value) && value.every((entry) => typeof entry === \"string\") ? [...value] : undefined;\n\nexport const askPayloadOf = (payload: unknown): AskPayload | undefined => {\n if (typeof payload !== \"object\" || payload === null) return undefined;\n const candidate = payload as Partial<AskPayload>;\n const options = stringArrayOf(candidate.options);\n if (typeof candidate.question !== \"string\" || !options) return undefined;\n return {\n question: candidate.question,\n options,\n multi: candidate.multi === true,\n ...(typeof candidate.recipient === \"string\" ? { recipient: candidate.recipient } : {}),\n };\n};\n\nexport const supersedingInputOf = (result: unknown): string | undefined => {\n if (typeof result !== \"object\" || result === null) return undefined;\n const { supersededBy } = result as { supersededBy?: unknown };\n return typeof supersededBy === \"string\" ? supersededBy : undefined;\n};\n", "import type { ToolContributor } from \"@ragents/engine\";\nimport { toolDescriptorFrom } from \"@ragents/host/plugin-support/agent-tool.js\";\nimport { facesOperator } from \"@ragents/host/plugin-support/tool-availability.js\";\nimport { askToolMetadata, createAskTool } from \"./ask-tool.js\";\nimport type { AskService } from \"./contract.js\";\n\nexport const createAskToolContributor = (service: AskService): ToolContributor => ({\n name: \"ragents.ask\",\n descriptors: [toolDescriptorFrom(askToolMetadata, facesOperator)],\n tools: () => [createAskTool(service)],\n});\n", "import { Type } from \"typebox\";\nimport { defineRunFunction, type RunFunction } from \"@ragents/engine\";\nimport { facesOperator } from \"@ragents/host/plugin-support/tool-availability.js\";\nimport type { AskService } from \"./contract.js\";\n\nexport const askToolMetadata = {\n name: \"ask_user\",\n label: \"R\u00FCckfrage\",\n description: \"Holt eine n\u00F6tige Benutzerentscheidung mit Antwortoptionen ein und wartet auf die Antwort.\",\n longDescription: \"Nutze dieses Werkzeug immer, wenn du eine Entscheidung des Benutzers brauchst \"\n + \"(z.B. Auswahl eines Branches oder eines Zeitraums), statt die Frage nur als Text zu stellen. \"\n + \"Mit multi=true darf der Benutzer mehrere Optionen w\u00E4hlen; die Antwort ist dann mit '; ' verbunden. \"\n + \"Der Benutzer kann statt einer Option auch immer frei antworten - rechne also damit, \"\n + \"dass die Antwort beliebiger Text sein kann.\",\n} as const;\n\nexport const createAskTool = (service: AskService): RunFunction =>\n defineRunFunction({\n ...askToolMetadata,\n schema: Type.Object({\n question: Type.String({ description: \"Die Frage an den Benutzer, kurz und konkret\" }),\n options: Type.Array(Type.String(), { description: \"Antwortoptionen (2 bis 6 St\u00FCck)\" }),\n multi: Type.Optional(Type.Boolean({ description: \"true = Mehrfachauswahl erlaubt\" })),\n }),\n resultSchema: Type.String(),\n available: facesOperator,\n executionMode: \"sequential\",\n run: (scope, toolCallId, input) =>\n service.ask(\n {\n runId: scope.caller.runId,\n agentId: scope.caller.actorId,\n turnId: scope.caller.turnId,\n commandId: scope.context(toolCallId).commandId,\n },\n { question: input.question, options: input.options, multi: input.multi === true },\n scope.signal,\n ),\n });\n"],
5
+ "mappings": "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",
6
+ "names": ["DomainError", "DomainError", "waiter", "facesOperator", "Type", "facesOperator"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ var s="ragents.ask",r="Not answered: the user sent a new message instead.",i=n=>Array.isArray(n)&&n.every(e=>typeof e=="string")?[...n]:void 0,o=n=>{if(typeof n!="object"||n===null)return;let e=n,t=i(e.options);if(!(typeof e.question!="string"||!t))return{question:e.question,options:t,multi:e.multi===!0,...typeof e.recipient=="string"?{recipient:e.recipient}:{}}},u=n=>{if(typeof n!="object"||n===null)return;let{supersededBy:e}=n;return typeof e=="string"?e:void 0};export{s as a,r as b,o as c,u as d};
2
+ //# sourceMappingURL=/plugins/ragents.ask/web/chunks/chunk-WFN4374U.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../plugins/ragents.ask/ask-payload.ts"],
4
+ "sourcesContent": ["export const ASK_PLUGIN_ID = \"ragents.ask\";\n\n/** What the asking tool call gets when a person's message to the asker closes its question. */\nexport const SUPERSEDED_ANSWER = \"Not answered: the user sent a new message instead.\";\n\nexport interface AskPayload {\n question: string;\n options: string[];\n multi: boolean;\n /** Der Actor, f\u00FCr den die Frage steht, wenn der Eigent\u00FCmer des Runs sie au\u00DFerhalb eines Turns stellt. */\n recipient?: string;\n}\n\nconst stringArrayOf = (value: unknown): string[] | undefined =>\n Array.isArray(value) && value.every((entry) => typeof entry === \"string\") ? [...value] : undefined;\n\nexport const askPayloadOf = (payload: unknown): AskPayload | undefined => {\n if (typeof payload !== \"object\" || payload === null) return undefined;\n const candidate = payload as Partial<AskPayload>;\n const options = stringArrayOf(candidate.options);\n if (typeof candidate.question !== \"string\" || !options) return undefined;\n return {\n question: candidate.question,\n options,\n multi: candidate.multi === true,\n ...(typeof candidate.recipient === \"string\" ? { recipient: candidate.recipient } : {}),\n };\n};\n\nexport const supersedingInputOf = (result: unknown): string | undefined => {\n if (typeof result !== \"object\" || result === null) return undefined;\n const { supersededBy } = result as { supersededBy?: unknown };\n return typeof supersededBy === \"string\" ? supersededBy : undefined;\n};\n"],
5
+ "mappings": "AAAO,IAAMA,EAAgB,cAGhBC,EAAoB,qDAU3BC,EAAiBC,GACrB,MAAM,QAAQA,CAAK,GAAKA,EAAM,MAAOC,GAAU,OAAOA,GAAU,QAAQ,EAAI,CAAC,GAAGD,CAAK,EAAI,OAE9EE,EAAgBC,GAA6C,CACxE,GAAI,OAAOA,GAAY,UAAYA,IAAY,KAAM,OACrD,IAAMC,EAAYD,EACZE,EAAUN,EAAcK,EAAU,OAAO,EAC/C,GAAI,SAAOA,EAAU,UAAa,UAAY,CAACC,GAC/C,MAAO,CACL,SAAUD,EAAU,SACpB,QAAAC,EACA,MAAOD,EAAU,QAAU,GAC3B,GAAI,OAAOA,EAAU,WAAc,SAAW,CAAE,UAAWA,EAAU,SAAU,EAAI,CAAC,CACtF,CACF,EAEaE,EAAsBC,GAAwC,CACzE,GAAI,OAAOA,GAAW,UAAYA,IAAW,KAAM,OACnD,GAAM,CAAE,aAAAC,CAAa,EAAID,EACzB,OAAO,OAAOC,GAAiB,SAAWA,EAAe,MAC3D",
6
+ "names": ["ASK_PLUGIN_ID", "SUPERSEDED_ANSWER", "stringArrayOf", "value", "entry", "askPayloadOf", "payload", "candidate", "options", "supersedingInputOf", "result", "supersededBy"]
7
+ }
@@ -1 +1 @@
1
- ["access","actionId","actionViews","activate","active","actorId","additionalProperties","alert","animate-ring-pulse","answer","answerQuestion","answerTextOf","answered","antworten","approved","aria-pressed","aria-pressed:bg-accent","aria-pressed:border-primary","as","ask","askContracts","askPayloadOf","askedBy","askerHandle","assess","async","attention","attentionFor","await","beantworten","bg-background","border","border-border","candidate","cardClasses","cardSections","caught","className","configuredPlugin","const","data-question","dazu","defineOperation","den","der","des","description","descriptor","die","disabled","dismiss","eine","eines","entry","export","false","flex","flex-1","flex-col","flex-none","font-normal","fragt","frei","freiSenden","freie","from","function","gap-1.5","gap-2","gap-2.5","grid","group-aria-pressed/button:border-primary","h-auto","handle","hat","id","if","immer","import","inline-flex","input","instanceof","interface","items-center","items-stretch","justify-center","justify-start","key","label","leading-[1.35]","leading-normal","length","list-disc","lucide-react","maxLength","mb-1.5","message","minLength","motion-reduce:animate-none","multi","needsRunView","noch","null","nur","o","object","oder","offen","ohne","onAnswer","onChange","onClick","onKeyDown","option","optionClasses","options","order","outline","owner","payload","pending","pending-questions","pendingQuestions","pl-6","placeholder","px-3","px-3.5","py-1.5","question","questions","react","read","recipient","rest","result","return","rights","role","rounded-lg","rounded-sm","rpc","runId","runViewFrom","self-start","session","setError","setFrei","setGewaehlt","sie","size","size-3.5","sm","status","string","stringArrayOf","text","text-[0.7rem]","text-destructive","text-left","text-muted-foreground","text-primary","text-sm","text-success","true","type","typebox","typeof","umschalten","und","undefined","useAccess","useState","value","variant","verwirft","view","w-full","wahlweise","webPlugin","wenn","wert","whitespace-normal","write"]
1
+ ["a","access","actionId","actionViews","activate","active","actorId","additionalProperties","alert","animate-ring-pulse","answer","answerQuestion","answerTextOf","answered","antworten","approved","aria-pressed","aria-pressed:bg-accent","aria-pressed:border-primary","as","ask","askContracts","askPayloadOf","askedBy","asker","askerHandle","asking","assess","async","attention","attentionFor","await","beantworten","bg-background","border","border-border","call","candidate","cardClasses","cardSections","caught","className","closes","configuredPlugin","const","data-question","dazu","defineOperation","den","der","des","description","descriptor","die","disabled","dismiss","eine","eines","entry","export","false","flex","flex-1","flex-col","flex-none","font-normal","fragt","frei","freiSenden","freie","from","function","gap-1.5","gap-2","gap-2.5","gets","grid","group-aria-pressed/button:border-primary","h-auto","handle","hat","id","if","immer","import","inline-flex","input","instanceof","interface","items-center","items-stretch","its","justify-center","justify-start","key","label","leading-[1.35]","leading-normal","length","list-disc","lucide-react","maxLength","mb-1.5","message","minLength","motion-reduce:animate-none","multi","needsRunView","new","noch","null","nur","o","object","oder","offen","ohne","onAnswer","onChange","onClick","onKeyDown","option","optionClasses","options","order","outline","owner","payload","pending","pending-questions","pendingQuestions","person","pl-6","placeholder","px-3","px-3.5","py-1.5","question","questions","react","read","recipient","rest","result","return","rights","role","rounded-lg","rounded-sm","rpc","runId","runViewFrom","s","self-start","sent","session","setError","setFrei","setGewaehlt","sie","size","size-3.5","sm","status","string","stringArrayOf","supersededBy","supersedingInputOf","text","text-[0.7rem]","text-destructive","text-left","text-muted-foreground","text-primary","text-sm","text-success","the","to","tool","true","type","typebox","typeof","umschalten","und","undefined","unknown","useAccess","useState","user","value","variant","verwirft","view","w-full","wahlweise","webPlugin","wenn","wert","when","whitespace-normal","write"]
@@ -1,2 +1,2 @@
1
- import{a,b}from"/plugins/ragents.ask/web/chunks/chunk-HGFDGTNC.js";export{a as ASK_PLUGIN_ID,b as askPayloadOf};
1
+ import{a,b,c,d}from"/plugins/ragents.ask/web/chunks/chunk-WFN4374U.js";export{a as ASK_PLUGIN_ID,b as SUPERSEDED_ANSWER,c as askPayloadOf,d as supersedingInputOf};
2
2
  //# sourceMappingURL=/plugins/ragents.ask/web/exports/ask-payload.js.map
@@ -1,2 +1,2 @@
1
- import{a as u,b as i}from"/plugins/ragents.ask/web/chunks/chunk-HGFDGTNC.js";import{a as y,b as V,c as k,d as o,e as d,f as P}from"/plugins/ragents.ask/web/chunks/chunk-V7W3QDVS.js";import{a as A}from"/plugins/ragents.ask/web/chunks/chunk-4VXWWEG7.js";import{a}from"/plugins/ragents.ask/web/chunks/chunk-VUBJDIKQ.js";var b=a("@ragents/web/run-view","runActorFrom");var l=a("@ragents/web/run-view","runViewFrom");var g=a("@ragents/web/AccessContext","useAccess");var R=e=>typeof e=="string"?e:e==null?"":JSON.stringify(e);function v({action:e,session:r,text:n}){let s=g(),[f,c]=y(),w=i(e.payload);if(!w)return null;let m=S=>{c(void 0),A(r.session.id,e.actionId,S).catch(t=>c(t instanceof Error?t.message:String(t)))};return d(k,{children:[o(P,{answer:e.status===void 0?void 0:e.status==="approved"?R(e.result):"Der Benutzer hat die Frage verworfen.",onAnswer:s.can("runs.write")?m:void 0,question:w,text:n}),f&&o("p",{className:"text-[0.7rem] text-destructive",role:"alert",children:f})]})}function C({actor:e,session:r}){let n=g(),[s,f]=y(),c=l(r.runView);if(!c)return null;let w=b(e).id,m=c.actions.filter(t=>t.owner===u&&(i(t.payload)?.recipient??t.askedBy)===w&&t.status==="pending");if(m.length===0)return null;let S=(t,x)=>{f(void 0),A(r.session.id,t,x).catch(p=>f(p instanceof Error?p.message:String(p)))};return d("section",{className:"grid gap-1.5",children:[d(V,{children:[o("span",{children:"R\xFCckfrage"}),o("small",{children:m.length})]}),m.map(t=>{let x=i(t.payload);return x&&d("div",{className:"rounded-lg animate-ring-pulse motion-reduce:animate-none",children:[t.description&&o("p",{className:"mb-1.5 text-[0.7rem] leading-[1.35] text-muted-foreground",children:t.description}),o(P,{onAnswer:n.can("runs.write")?p=>S(t.id,p):void 0,question:x,text:t.title})]},t.id)}),s&&o("p",{className:"text-[0.7rem] text-destructive",role:"alert",children:s})]})}var I=e=>e.actions.filter(r=>r.owner===u&&r.status==="pending"),N=(e,r)=>e.actors.find(n=>n.id===r)?.handle??r,Q=e=>{let r=l(e.runView);if(!r)return;let[n,...s]=I(r);if(n)return{active:!0,label:s.length===0?`@${N(r,i(n.payload)?.recipient??n.askedBy)} fragt`:`${s.length+1} R\xFCckfragen offen`}},q=e=>({...e,needsRunView:!0,actionViews:[{owner:u,View:v}],cardSections:[{id:"ragents.ask.questions",order:100,Section:C}],attention:[{id:"ragents.ask.pending-questions",assess:Q}]}),F={id:u},fe={...F,activate:()=>q(F)};export{fe as webPlugin};
1
+ import{a as u,b as V,c as i,d as k}from"/plugins/ragents.ask/web/chunks/chunk-WFN4374U.js";import{a as A,b as v,c as C,d as o,e as d,f as y}from"/plugins/ragents.ask/web/chunks/chunk-V7W3QDVS.js";import{a as S}from"/plugins/ragents.ask/web/chunks/chunk-4VXWWEG7.js";import{a}from"/plugins/ragents.ask/web/chunks/chunk-VUBJDIKQ.js";var b=a("@ragents/web/run-view","runActorFrom");var l=a("@ragents/web/run-view","runViewFrom");var g=a("@ragents/web/AccessContext","useAccess");var N=e=>typeof e=="string"?e:e==null?"":JSON.stringify(e);function R({action:e,session:r,text:n}){let s=g(),[f,m]=A(),w=i(e.payload);if(!w)return null;let p=P=>{m(void 0),S(r.session.id,e.actionId,P).catch(t=>m(t instanceof Error?t.message:String(t)))};return d(C,{children:[o(y,{answer:e.status===void 0?void 0:e.status==="approved"?N(e.result):k(e.result)!==void 0?V:"Der Benutzer hat die Frage verworfen.",onAnswer:s.can("runs.write")?p:void 0,question:w,text:n}),f&&o("p",{className:"text-[0.7rem] text-destructive",role:"alert",children:f})]})}function F({actor:e,session:r}){let n=g(),[s,f]=A(),m=l(r.runView);if(!m)return null;let w=b(e).id,p=m.actions.filter(t=>t.owner===u&&(i(t.payload)?.recipient??t.askedBy)===w&&t.status==="pending");if(p.length===0)return null;let P=(t,x)=>{f(void 0),S(r.session.id,t,x).catch(c=>f(c instanceof Error?c.message:String(c)))};return d("section",{className:"grid gap-1.5",children:[d(v,{children:[o("span",{children:"R\xFCckfrage"}),o("small",{children:p.length})]}),p.map(t=>{let x=i(t.payload);return x&&d("div",{className:"rounded-lg animate-ring-pulse motion-reduce:animate-none",children:[t.description&&o("p",{className:"mb-1.5 text-[0.7rem] leading-[1.35] text-muted-foreground",children:t.description}),o(y,{onAnswer:n.can("runs.write")?c=>P(t.id,c):void 0,question:x,text:t.title})]},t.id)}),s&&o("p",{className:"text-[0.7rem] text-destructive",role:"alert",children:s})]})}var D=e=>e.actions.filter(r=>r.owner===u&&r.status==="pending"),E=(e,r)=>e.actors.find(n=>n.id===r)?.handle??r,Q=e=>{let r=l(e.runView);if(!r)return;let[n,...s]=D(r);if(n)return{active:!0,label:s.length===0?`@${E(r,i(n.payload)?.recipient??n.askedBy)} fragt`:`${s.length+1} R\xFCckfragen offen`}},W=e=>({...e,needsRunView:!0,actionViews:[{owner:u,View:R}],cardSections:[{id:"ragents.ask.questions",order:100,Section:F}],attention:[{id:"ragents.ask.pending-questions",assess:Q}]}),I={id:u},pe={...I,activate:()=>W(I)};export{pe as webPlugin};
2
2
  //# sourceMappingURL=/plugins/ragents.ask/web/index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["ragents-host-value:@ragents/web/run-view#runActorFrom", "ragents-host-value:@ragents/web/run-view#runViewFrom", "ragents-host-value:@ragents/web/AccessContext#useAccess", "../../../plugins/ragents.ask/web/AskActionView.tsx", "../../../plugins/ragents.ask/web/QuestionSection.tsx", "../../../plugins/ragents.ask/web/index.tsx"],
4
- "sourcesContent": ["import { read } from \"ragents-host-read:read\";\nexport default read(\"@ragents/web/run-view\", \"runActorFrom\");\n", "import { read } from \"ragents-host-read:read\";\nexport default read(\"@ragents/web/run-view\", \"runViewFrom\");\n", "import { read } from \"ragents-host-read:read\";\nexport default read(\"@ragents/web/AccessContext\", \"useAccess\");\n", "import { useAccess } from \"@ragents/web/AccessContext\";\nimport { useState } from \"react\";\nimport type { ActionViewContext } from \"@ragents/web/PluginRegistry\";\nimport { askPayloadOf } from \"../ask-payload\";\nimport { answerQuestion } from \"./api\";\nimport { QuestionCard } from \"./QuestionCard\";\n\nconst answerTextOf = (result: unknown): string =>\n typeof result === \"string\" ? result : result === null || result === undefined ? \"\" : JSON.stringify(result);\n\nexport function AskActionView({ action, session, text }: ActionViewContext) {\n const access = useAccess();\n const [error, setError] = useState<string>();\n const question = askPayloadOf(action.payload);\n if (!question) return null;\n\n const answer = (value: string) => {\n setError(undefined);\n answerQuestion(session.session.id, action.actionId, value)\n .catch((caught: unknown) => setError(caught instanceof Error ? caught.message : String(caught)));\n };\n\n return (\n <>\n <QuestionCard\n answer={action.status === undefined\n ? undefined\n : action.status === \"approved\" ? answerTextOf(action.result) : \"Der Benutzer hat die Frage verworfen.\"}\n onAnswer={access.can(\"runs.write\") ? answer : undefined}\n question={question}\n text={text}\n />\n {error && <p className=\"text-[0.7rem] text-destructive\" role=\"alert\">{error}</p>}\n </>\n );\n}\n", "import { useAccess } from \"@ragents/web/AccessContext\";\nimport { useState } from \"react\";\nimport { runActorFrom, runViewFrom } from \"@ragents/web/run-view\";\nimport type { CardSectionContext } from \"@ragents/web/PluginRegistry\";\nimport { SectionLabel } from \"@ragents/web/ui\";\nimport { askPayloadOf, ASK_PLUGIN_ID } from \"../ask-payload\";\nimport { answerQuestion } from \"./api\";\nimport { QuestionCard } from \"./QuestionCard\";\n\nexport function QuestionSection({ actor, session }: CardSectionContext) {\n const access = useAccess();\n const [error, setError] = useState<string>();\n const view = runViewFrom(session.runView);\n if (!view) return null;\n const actorId = runActorFrom(actor).id;\n const pending = view.actions.filter((action) =>\n action.owner === ASK_PLUGIN_ID && (askPayloadOf(action.payload)?.recipient ?? action.askedBy) === actorId && action.status === \"pending\");\n if (pending.length === 0) return null;\n\n const answer = (actionId: string, text: string) => {\n setError(undefined);\n answerQuestion(session.session.id, actionId, text)\n .catch((caught: unknown) => setError(caught instanceof Error ? caught.message : String(caught)));\n };\n\n return (\n <section className=\"grid gap-1.5\">\n <SectionLabel>\n <span>R\u00FCckfrage</span>\n <small>{pending.length}</small>\n </SectionLabel>\n {pending.map((action) => {\n const question = askPayloadOf(action.payload);\n return question && (\n <div className=\"rounded-lg animate-ring-pulse motion-reduce:animate-none\" key={action.id}>\n {action.description && <p className=\"mb-1.5 text-[0.7rem] leading-[1.35] text-muted-foreground\">{action.description}</p>}\n <QuestionCard\n onAnswer={access.can(\"runs.write\") ? (text) => answer(action.id, text) : undefined}\n question={question}\n text={action.title}\n />\n </div>\n );\n })}\n {error && <p className=\"text-[0.7rem] text-destructive\" role=\"alert\">{error}</p>}\n </section>\n );\n}\n", "import {\n type SessionContext,\n type WebPlugin,\n type WebPluginDescriptor,\n} from \"@ragents/web/PluginRegistry\";\nimport { runViewFrom, type RunView } from \"@ragents/web/run-view\";\nimport { askPayloadOf, ASK_PLUGIN_ID } from \"../ask-payload\";\nimport { AskActionView } from \"./AskActionView\";\nimport { QuestionSection } from \"./QuestionSection\";\n\nconst pendingQuestions = (view: RunView) =>\n view.actions.filter((action) => action.owner === ASK_PLUGIN_ID && action.status === \"pending\");\n\nconst askerHandle = (view: RunView, askedBy: string): string =>\n view.actors.find((actor) => actor.id === askedBy)?.handle ?? askedBy;\n\nconst attentionFor = (session: SessionContext) => {\n const view = runViewFrom(session.runView);\n if (!view) return undefined;\n const [first, ...rest] = pendingQuestions(view);\n if (!first) return undefined;\n return {\n active: true as const,\n label: rest.length === 0\n ? `@${askerHandle(view, askPayloadOf(first.payload)?.recipient ?? first.askedBy)} fragt`\n : `${rest.length + 1} R\u00FCckfragen offen`,\n };\n};\n\nconst configuredPlugin = (descriptor: WebPluginDescriptor): WebPlugin => ({\n ...descriptor,\n needsRunView: true,\n actionViews: [{\n owner: ASK_PLUGIN_ID,\n View: AskActionView,\n }],\n cardSections: [{\n id: \"ragents.ask.questions\",\n order: 100,\n Section: QuestionSection,\n }],\n attention: [{\n id: \"ragents.ask.pending-questions\",\n assess: attentionFor,\n }],\n});\n\nconst descriptor: WebPluginDescriptor = { id: ASK_PLUGIN_ID };\n\nexport const webPlugin: WebPlugin = {\n ...descriptor,\n activate: () => configuredPlugin(descriptor),\n};\n"],
5
- "mappings": "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",
6
- "names": ["run_view_runActorFrom_default", "read", "run_view_runViewFrom_default", "read", "AccessContext_useAccess_default", "read", "answerTextOf", "result", "AskActionView", "action", "session", "text", "access", "AccessContext_useAccess_default", "error", "setError", "react_useState_default", "question", "askPayloadOf", "answer", "value", "answerQuestion", "caught", "jsx_runtime_jsxs_default", "jsx_runtime_Fragment_default", "jsx_runtime_jsx_default", "QuestionCard", "QuestionSection", "actor", "session", "access", "AccessContext_useAccess_default", "error", "setError", "react_useState_default", "view", "run_view_runViewFrom_default", "actorId", "run_view_runActorFrom_default", "pending", "action", "ASK_PLUGIN_ID", "askPayloadOf", "answer", "actionId", "text", "answerQuestion", "caught", "jsx_runtime_jsxs_default", "ui_SectionLabel_default", "jsx_runtime_jsx_default", "question", "QuestionCard", "pendingQuestions", "view", "action", "ASK_PLUGIN_ID", "askerHandle", "askedBy", "actor", "attentionFor", "session", "run_view_runViewFrom_default", "first", "rest", "askPayloadOf", "configuredPlugin", "descriptor", "AskActionView", "QuestionSection", "webPlugin"]
4
+ "sourcesContent": ["import { read } from \"ragents-host-read:read\";\nexport default read(\"@ragents/web/run-view\", \"runActorFrom\");\n", "import { read } from \"ragents-host-read:read\";\nexport default read(\"@ragents/web/run-view\", \"runViewFrom\");\n", "import { read } from \"ragents-host-read:read\";\nexport default read(\"@ragents/web/AccessContext\", \"useAccess\");\n", "import { useAccess } from \"@ragents/web/AccessContext\";\nimport { useState } from \"react\";\nimport type { ActionViewContext } from \"@ragents/web/PluginRegistry\";\nimport { askPayloadOf, SUPERSEDED_ANSWER, supersedingInputOf } from \"../ask-payload\";\nimport { answerQuestion } from \"./api\";\nimport { QuestionCard } from \"./QuestionCard\";\n\nconst answerTextOf = (result: unknown): string =>\n typeof result === \"string\" ? result : result === null || result === undefined ? \"\" : JSON.stringify(result);\n\nexport function AskActionView({ action, session, text }: ActionViewContext) {\n const access = useAccess();\n const [error, setError] = useState<string>();\n const question = askPayloadOf(action.payload);\n if (!question) return null;\n\n const answer = (value: string) => {\n setError(undefined);\n answerQuestion(session.session.id, action.actionId, value)\n .catch((caught: unknown) => setError(caught instanceof Error ? caught.message : String(caught)));\n };\n\n return (\n <>\n <QuestionCard\n answer={action.status === undefined\n ? undefined\n : action.status === \"approved\" ? answerTextOf(action.result)\n : supersedingInputOf(action.result) !== undefined ? SUPERSEDED_ANSWER : \"Der Benutzer hat die Frage verworfen.\"}\n onAnswer={access.can(\"runs.write\") ? answer : undefined}\n question={question}\n text={text}\n />\n {error && <p className=\"text-[0.7rem] text-destructive\" role=\"alert\">{error}</p>}\n </>\n );\n}\n", "import { useAccess } from \"@ragents/web/AccessContext\";\nimport { useState } from \"react\";\nimport { runActorFrom, runViewFrom } from \"@ragents/web/run-view\";\nimport type { CardSectionContext } from \"@ragents/web/PluginRegistry\";\nimport { SectionLabel } from \"@ragents/web/ui\";\nimport { askPayloadOf, ASK_PLUGIN_ID } from \"../ask-payload\";\nimport { answerQuestion } from \"./api\";\nimport { QuestionCard } from \"./QuestionCard\";\n\nexport function QuestionSection({ actor, session }: CardSectionContext) {\n const access = useAccess();\n const [error, setError] = useState<string>();\n const view = runViewFrom(session.runView);\n if (!view) return null;\n const actorId = runActorFrom(actor).id;\n const pending = view.actions.filter((action) =>\n action.owner === ASK_PLUGIN_ID && (askPayloadOf(action.payload)?.recipient ?? action.askedBy) === actorId && action.status === \"pending\");\n if (pending.length === 0) return null;\n\n const answer = (actionId: string, text: string) => {\n setError(undefined);\n answerQuestion(session.session.id, actionId, text)\n .catch((caught: unknown) => setError(caught instanceof Error ? caught.message : String(caught)));\n };\n\n return (\n <section className=\"grid gap-1.5\">\n <SectionLabel>\n <span>R\u00FCckfrage</span>\n <small>{pending.length}</small>\n </SectionLabel>\n {pending.map((action) => {\n const question = askPayloadOf(action.payload);\n return question && (\n <div className=\"rounded-lg animate-ring-pulse motion-reduce:animate-none\" key={action.id}>\n {action.description && <p className=\"mb-1.5 text-[0.7rem] leading-[1.35] text-muted-foreground\">{action.description}</p>}\n <QuestionCard\n onAnswer={access.can(\"runs.write\") ? (text) => answer(action.id, text) : undefined}\n question={question}\n text={action.title}\n />\n </div>\n );\n })}\n {error && <p className=\"text-[0.7rem] text-destructive\" role=\"alert\">{error}</p>}\n </section>\n );\n}\n", "import {\n type SessionContext,\n type WebPlugin,\n type WebPluginDescriptor,\n} from \"@ragents/web/PluginRegistry\";\nimport { runViewFrom, type RunView } from \"@ragents/web/run-view\";\nimport { askPayloadOf, ASK_PLUGIN_ID } from \"../ask-payload\";\nimport { AskActionView } from \"./AskActionView\";\nimport { QuestionSection } from \"./QuestionSection\";\n\nconst pendingQuestions = (view: RunView) =>\n view.actions.filter((action) => action.owner === ASK_PLUGIN_ID && action.status === \"pending\");\n\nconst askerHandle = (view: RunView, askedBy: string): string =>\n view.actors.find((actor) => actor.id === askedBy)?.handle ?? askedBy;\n\nconst attentionFor = (session: SessionContext) => {\n const view = runViewFrom(session.runView);\n if (!view) return undefined;\n const [first, ...rest] = pendingQuestions(view);\n if (!first) return undefined;\n return {\n active: true as const,\n label: rest.length === 0\n ? `@${askerHandle(view, askPayloadOf(first.payload)?.recipient ?? first.askedBy)} fragt`\n : `${rest.length + 1} R\u00FCckfragen offen`,\n };\n};\n\nconst configuredPlugin = (descriptor: WebPluginDescriptor): WebPlugin => ({\n ...descriptor,\n needsRunView: true,\n actionViews: [{\n owner: ASK_PLUGIN_ID,\n View: AskActionView,\n }],\n cardSections: [{\n id: \"ragents.ask.questions\",\n order: 100,\n Section: QuestionSection,\n }],\n attention: [{\n id: \"ragents.ask.pending-questions\",\n assess: attentionFor,\n }],\n});\n\nconst descriptor: WebPluginDescriptor = { id: ASK_PLUGIN_ID };\n\nexport const webPlugin: WebPlugin = {\n ...descriptor,\n activate: () => configuredPlugin(descriptor),\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["run_view_runActorFrom_default", "read", "run_view_runViewFrom_default", "read", "AccessContext_useAccess_default", "read", "answerTextOf", "result", "AskActionView", "action", "session", "text", "access", "AccessContext_useAccess_default", "error", "setError", "react_useState_default", "question", "askPayloadOf", "answer", "value", "answerQuestion", "caught", "jsx_runtime_jsxs_default", "jsx_runtime_Fragment_default", "jsx_runtime_jsx_default", "QuestionCard", "supersedingInputOf", "SUPERSEDED_ANSWER", "QuestionSection", "actor", "session", "access", "AccessContext_useAccess_default", "error", "setError", "react_useState_default", "view", "run_view_runViewFrom_default", "actorId", "run_view_runActorFrom_default", "pending", "action", "ASK_PLUGIN_ID", "askPayloadOf", "answer", "actionId", "text", "answerQuestion", "caught", "jsx_runtime_jsxs_default", "ui_SectionLabel_default", "jsx_runtime_jsx_default", "question", "QuestionCard", "pendingQuestions", "view", "action", "ASK_PLUGIN_ID", "askerHandle", "askedBy", "actor", "attentionFor", "session", "run_view_runViewFrom_default", "first", "rest", "askPayloadOf", "configuredPlugin", "descriptor", "AskActionView", "QuestionSection", "webPlugin"]
7
7
  }