@abot-ai/runtime 1.8.0 → 1.8.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 (119) hide show
  1. package/README.md +216 -222
  2. package/dist/src/capabilities/tool-definition-validator/definition-parser.js +8 -0
  3. package/dist/src/capabilities/tool-types.d.ts +4 -0
  4. package/dist/src/model-gateway/protocol/message-contract.d.ts +1 -0
  5. package/dist/src/model-gateway/protocol/message-contract.js +1 -1
  6. package/dist/src/model-gateway/server/chat-handler.js +5 -7
  7. package/dist/src/model-gateway/server/chat-stream-response.d.ts +7 -0
  8. package/dist/src/model-gateway/server/chat-stream-response.js +25 -0
  9. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-rejection.d.ts +2 -2
  10. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-rejection.js +2 -2
  11. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/prepared-execution.js +17 -11
  12. package/dist/src/runtime/capabilities/tool-availability.js +6 -0
  13. package/dist/src/runtime/context/capability-brief.d.ts +2 -2
  14. package/dist/src/runtime/context/capability-brief.js +3 -3
  15. package/dist/src/runtime/context/capability-descriptions.d.ts +3 -2
  16. package/dist/src/runtime/context/capability-descriptions.js +57 -20
  17. package/dist/src/runtime/long-term-memory/conversation-authoring/context.d.ts +6 -1
  18. package/dist/src/runtime/long-term-memory/conversation-authoring/context.js +51 -25
  19. package/dist/src/runtime/long-term-memory/initial-context.d.ts +17 -0
  20. package/dist/src/runtime/long-term-memory/initial-context.js +57 -0
  21. package/dist/src/runtime/long-term-memory/projection.js +1 -1
  22. package/dist/src/runtime/orchestration/role-calls/candidate-validation.js +2 -1
  23. package/dist/src/runtime/orchestration/role-calls/checkpoint-state.d.ts +1 -1
  24. package/dist/src/runtime/orchestration/role-calls/checkpoint-state.js +5 -2
  25. package/dist/src/runtime/orchestration/role-calls/contracts.d.ts +2 -1
  26. package/dist/src/runtime/orchestration/role-calls/ledger.d.ts +2 -1
  27. package/dist/src/runtime/orchestration/role-calls/ledger.js +2 -2
  28. package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.d.ts +7 -0
  29. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.d.ts +2 -0
  30. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.js +88 -0
  31. package/dist/src/runtime/orchestration/role-calls/reducer.d.ts +1 -1
  32. package/dist/src/runtime/orchestration/role-calls/reducer.js +2 -1
  33. package/dist/src/runtime/orchestration/worker-capabilities/contracts.d.ts +3 -1
  34. package/dist/src/runtime/orchestration/worker-capabilities/contracts.js +1 -1
  35. package/dist/src/runtime/orchestration/worker-capabilities/execution/approval-group.js +5 -1
  36. package/dist/src/runtime/orchestration/worker-capabilities/execution/execution-freshness.d.ts +5 -0
  37. package/dist/src/runtime/orchestration/worker-capabilities/execution/execution-freshness.js +31 -0
  38. package/dist/src/runtime/plugins/manifest-projection.js +3 -0
  39. package/dist/src/runtime/request/capability-execution-freshness.js +6 -1
  40. package/dist/src/runtime/request/execution-agent-root-execution.js +11 -1
  41. package/dist/src/runtime/request/root-contract.d.ts +2 -0
  42. package/dist/src/runtime/request/root-execution-kernel.js +1 -0
  43. package/dist/src/runtime/request/runner.js +9 -3
  44. package/dist/src/runtime/request/supervisor-root-execution.js +6 -0
  45. package/dist/src/runtime/steps/execution-agent/contracts.d.ts +10 -0
  46. package/dist/src/runtime/steps/execution-agent/decision-parsing.js +13 -1
  47. package/dist/src/runtime/steps/execution-agent/direct-response-configuration.d.ts +3 -0
  48. package/dist/src/runtime/steps/execution-agent/direct-response-configuration.js +64 -0
  49. package/dist/src/runtime/steps/execution-agent/direct-response-contract.d.ts +7 -0
  50. package/dist/src/runtime/steps/execution-agent/direct-response-contract.js +56 -0
  51. package/dist/src/runtime/steps/execution-agent/direct-response-policy.d.ts +9 -0
  52. package/dist/src/runtime/steps/execution-agent/direct-response-policy.js +30 -0
  53. package/dist/src/runtime/steps/execution-agent/direct-response-prompt.d.ts +7 -0
  54. package/dist/src/runtime/steps/execution-agent/direct-response-prompt.js +43 -0
  55. package/dist/src/runtime/steps/execution-agent/format.js +2 -0
  56. package/dist/src/runtime/steps/execution-agent/input.d.ts +2 -0
  57. package/dist/src/runtime/steps/execution-agent/input.js +22 -1
  58. package/dist/src/runtime/steps/execution-agent/plugin-catalog.d.ts +4 -0
  59. package/dist/src/runtime/steps/execution-agent/plugin-catalog.js +8 -0
  60. package/dist/src/runtime/steps/execution-agent/prompt.d.ts +1 -0
  61. package/dist/src/runtime/steps/execution-agent/prompt.js +3 -4
  62. package/dist/src/runtime/steps/execution-agent/response-run.js +5 -11
  63. package/dist/src/runtime/steps/execution-agent/run.js +4 -1
  64. package/dist/src/runtime/steps/execution-agent/state-context.d.ts +2 -3
  65. package/dist/src/runtime/steps/execution-agent/state-context.js +2 -39
  66. package/dist/src/runtime/steps/planner-decision/capability-brief.d.ts +2 -0
  67. package/dist/src/runtime/steps/planner-decision/prompt.js +26 -49
  68. package/dist/src/runtime/steps/supervisor-decision/input.d.ts +1 -0
  69. package/dist/src/runtime/steps/supervisor-decision/input.js +5 -0
  70. package/dist/src/runtime/steps/supervisor-decision/prompt.d.ts +1 -0
  71. package/dist/src/runtime/steps/supervisor-decision/prompt.js +6 -2
  72. package/dist/src/runtime/steps/supervisor-decision/run.d.ts +1 -0
  73. package/dist/src/runtime/steps/supervisor-decision/run.js +4 -0
  74. package/dist/src/runtime/steps/supervisor-response/run.d.ts +2 -0
  75. package/dist/src/runtime/steps/supervisor-response/run.js +3 -6
  76. package/dist/src/web-ui/app/ARCHITECTURE.md +1 -1
  77. package/dist/src/web-ui/app/app.js +1 -0
  78. package/dist/src/web-ui/app/components/automations/timeline.js +3 -2
  79. package/dist/src/web-ui/app/components/dashboard/compact-layout.js +137 -0
  80. package/dist/src/web-ui/app/components/dashboard/icons.js +5 -0
  81. package/dist/src/web-ui/app/components/dashboard/widget-card.js +85 -0
  82. package/dist/src/web-ui/app/components/dashboard/widget-dialog.js +83 -0
  83. package/dist/src/web-ui/app/components/dashboard/widget-summaries.js +155 -0
  84. package/dist/src/web-ui/app/components/dashboard/workspace.js +28 -4
  85. package/dist/src/web-ui/app/components/operations-summary.js +2 -1
  86. package/dist/src/web-ui/app/components/passive-learning/home-widget-preview.js +32 -0
  87. package/dist/src/web-ui/app/components/passive-learning/home.js +4 -1
  88. package/dist/src/web-ui/app/components/schedules/details.js +3 -2
  89. package/dist/src/web-ui/app/components/spark-chat/panel.js +1 -1
  90. package/dist/src/web-ui/app/components/spark-chat/settings.js +1 -1
  91. package/dist/src/web-ui/app/components/system-host/home-widget-permission-preview.js +75 -0
  92. package/dist/src/web-ui/app/components/system-host/home-widget-summary.js +93 -0
  93. package/dist/src/web-ui/app/components/system-host/macos-permission-rendering.js +2 -2
  94. package/dist/src/web-ui/app/components/system-host/native-windows-access.js +1 -1
  95. package/dist/src/web-ui/app/components/system-host/rendering.js +3 -3
  96. package/dist/src/web-ui/app/components/system-host/windows-store-setup.js +2 -2
  97. package/dist/src/web-ui/app/computer-access-feature.js +13 -1
  98. package/dist/src/web-ui/app/configuration-feature.js +2 -0
  99. package/dist/src/web-ui/app/controllers/operations-controller.js +2 -1
  100. package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +1 -1
  101. package/dist/src/web-ui/app/dashboard-feature.js +9 -0
  102. package/dist/src/web-ui/app/lib/reasoning-controls.js +6 -1
  103. package/dist/src/web-ui/app/passive-learning-feature.js +2 -2
  104. package/dist/src/web-ui/app/styles/95-home-widgets.css +109 -0
  105. package/dist/src/web-ui/app/styles.css +1 -0
  106. package/docs/plugins.md +37 -32
  107. package/package.json +1 -1
  108. package/plugins/capability-brief/plugin.json +1 -1
  109. package/plugins/code-outline/plugin.json +1 -1
  110. package/plugins/document-reader/plugin.json +1 -1
  111. package/plugins/exec/plugin.json +1 -1
  112. package/plugins/filesystem/plugin.json +1 -1
  113. package/plugins/json-inspector/plugin.json +1 -1
  114. package/plugins/local-search/plugin.json +1 -1
  115. package/plugins/memory/plugin.json +1 -1
  116. package/plugins/project-orientation/plugin.json +1 -1
  117. package/plugins/system/plugin.json +1 -1
  118. package/plugins/system-probe/plugin.json +1 -1
  119. package/plugins/web/plugin.json +1 -1
package/README.md CHANGED
@@ -1,294 +1,288 @@
1
1
  # ABot Runtime
2
2
 
3
- Open TypeScript runtime for building inspectable AI agents with local or hosted
4
- language models.
5
-
6
- ABot Runtime provides the execution layer around a model: sessions, tools,
7
- plugins, model routing, persisted events, and a local graphical interface. It
8
- does not choose a model for you or hide model-provider behavior behind
9
- hardcoded defaults.
10
-
11
- [Website](https://abot-ai.com/) · [Documentation](#documentation) · [GitHub](https://github.com/Dorshitrit/abot-runtime)
12
-
13
- ## Features
14
-
15
- - Configurable local and hosted model providers
16
- - Persistent conversations, request events, and replay
17
- - Optional long-term memory with protected saves and reviewed automatic candidates
18
- - ABot Spark for optional desktop learning and proactive conversation suggestions
19
- - Desktop observation and control through shared Computer access
20
- - A notification inbox and optional native desktop alerts
21
- - Local scheduled requests bound to their conversations
22
- - Planning, execution, and review workflows
23
- - Manifest-based tools and plugins with explicit runtime boundaries
24
- - Workspace, file, skill, and memory capabilities
25
- - Streaming model and tool activity
26
- - A local Web UI for everyday use and inspection
27
- - An optional bridge transport for integration with external applications
28
-
29
- ## Web UI
30
-
31
- The source checkout includes the project's primary GUI. It uses the direct
32
- local runtime backend by default, so an external bridge is not required.
33
-
34
- The Web UI supports:
35
-
36
- - creating, pinning, reordering, archiving, reopening, and deleting conversations
37
- - choosing the active environment, model, and reasoning mode
38
- - uploading files and images
39
- - streaming messages, current activity, tool progress, and failures
40
- - steering or stopping an active request, or queuing the next message
41
- - editing runtime configuration
42
- - configuring passive long-term memory with a consumer-selected embedding model
43
- - managing scheduled Jobs, their saved models and permissions, and run history
44
- - controlling Spark collection, learning, proactive suggestions, and application exclusions
45
- - reviewing saved memories and opening notification sources
46
- - inspecting runtime status, logs, and health
47
-
48
- The UI is a client of the runtime; persisted sessions, events, and request state
49
- remain owned by the runtime.
50
-
51
- Schedules can also be managed through the model's built-in `schedules` capability.
52
- Every Job belongs to a conversation and runs there with its saved model and Full
53
- or FULL+ tool permissions. New Jobs default to Full. The chat shows a compact run
54
- card; expand it to read the exact historical prompt. ABot must be running at the scheduled time. Missed offline
55
- occurrences and failed runs are not retried. Cancelling a Job or deleting its
56
- conversation prevents pending starts; an already-started run continues.
57
-
58
- Timers, one-time requests, intervals, and daily/weekly/monthly schedules are
59
- supported. Calendar schedules require an exact time and IANA time zone. Jobs and
60
- run history are stored locally under the environment's runtime directory.
61
- Scheduling uses the Runtime directly and requires no plugin or external bridge.
62
-
63
- ## Requirements
64
-
65
- - Node.js `^20.19.0` or `>=22.12.0` (Node.js 21 is not supported)
66
- - npm
67
- - A configured model provider and model
3
+ **Put your language model to work with tools, memory, and repeatable workflows.**
4
+
5
+ ABot Runtime is an open-source TypeScript engine for AI agents that work with
6
+ files, use tools, retain useful context, and carry out multi-step tasks.
7
+
8
+ **Work locally, with a model you choose.** Run Ollama on your own machine and
9
+ keep task data local when generation, memory embeddings, SPARK models, and the
10
+ tools you use are all local. Hosted models, remote endpoints, Web access, and
11
+ other external tools can send relevant data outside your machine.
12
+
13
+ Use the bundled Web UI as your everyday workspace, or embed the same runtime
14
+ in your own application. Connect a local or hosted model, choose how it should
15
+ work, and keep visibility into its actions and results.
16
+
17
+ [Website](https://abot-ai.com/) · [Get started](#get-started) · [Documentation](#documentation) · [Releases](https://github.com/Dorshitrit/abot-runtime/releases)
18
+
19
+ ![ABot Studio starter templates for research, documents, and system review](https://abot-ai.com/_astro/studio-templates.CvsBi5Kw.png)
20
+
21
+ *Start from a Studio template, then choose your inputs, model, and permissions.*
22
+
23
+ ## What can you do with ABot?
24
+
25
+ - **Research and produce something useful.** Compare public sources and save a
26
+ sourced Markdown brief with findings and open questions.
27
+ - **Work with documents and projects.** Summarize a document, explain a code
28
+ module, inspect configuration, or work with files using the enabled tools.
29
+ - **Automate recurring work.** Save a request as a scheduled Job, or build a
30
+ reusable Studio workflow that processes inputs through several steps.
31
+ - **Build an agent into your product.** Reuse ABot's execution, session, tool,
32
+ and event interfaces behind your own application.
33
+
34
+ These workflows use the models, plugins, credentials, and permissions you
35
+ configure.
36
+
37
+ ## One engine, two execution routes
38
+
39
+ Different models benefit from different ways of working. ABot gives you two
40
+ routes within the same runtime:
41
+
42
+ | | Execution Agent (EA) | Supervisor (SUPER) |
43
+ |---|---|---|
44
+ | Designed for | Capable models that can take broader responsibility for a task | Models that benefit from smaller, focused responsibilities, including local models |
45
+ | How it works | The main agent selects and runs tools directly, with optional planning and audit advice | A Supervisor coordinates the request and delegates to Planner, Worker, and Reviewer roles when needed |
46
+ | Tool execution | Owned by the Execution Agent | Delegated to a Worker |
47
+
48
+ **EA gives capable models room to act. SUPER gives models a more structured
49
+ division of work.**
50
+
51
+ Both routes share tools, permission controls, conversations, persistence, and
52
+ execution infrastructure. Both can be used with local or hosted models.
53
+ Choose according to the model's capabilities and the tasks you want it to perform.
54
+
55
+ In the Web UI, select **Execution Agent** or **Supervisor** under a model's
56
+ **Execution route** setting. The choice belongs to the model profile.
57
+
58
+ Planning and review are available when needed; individual requests do not have
59
+ to pass through every role. Results still depend on the model, context window,
60
+ configuration, and available tools.
68
61
 
69
- Ollama and OpenAI adapters are included. The Ollama server and model files are
70
- not: install Ollama from the [official download page](https://ollama.com/download)
71
- and pull a model you choose. OpenAI profiles require `OPENAI_API_KEY`. ABot
72
- Runtime has no built-in default model.
62
+ See [Configuration](docs/configuration.md#request-runner) for technical policy
63
+ names, defaults, and model calibration.
73
64
 
74
- ## Install And Run
65
+ ## Get started
75
66
 
76
- Create a consumer project and install the package:
67
+ You need:
68
+
69
+ - Node.js `^20.19.0` or `>=22.12.0`; Node.js 21 is not supported
70
+ - npm
71
+ - An OpenAI or Ollama model connection
72
+
73
+ Create a directory for your ABot installation:
77
74
 
78
75
  ```bash
79
76
  mkdir my-abot
80
77
  cd my-abot
81
78
  npm init -y
82
79
  npm install @abot-ai/runtime
80
+ npx abot start
83
81
  ```
84
82
 
85
- Initialize one explicit provider and model, then start the model gateway and
86
- Web UI with one command:
83
+ Open [http://127.0.0.1:5177](http://127.0.0.1:5177).
87
84
 
88
- ```bash
89
- npx abot init --provider ollama --model <model-id>
90
- npx abot start
91
- ```
85
+ The setup wizard guides you through connecting a provider, selecting a model,
86
+ choosing tools, and optionally enabling semantic memory.
92
87
 
93
- Open [http://127.0.0.1:5177](http://127.0.0.1:5177). The generated files and
94
- runtime state belong to the consumer project; installing the package does not
95
- write into the package directory.
88
+ - **OpenAI:** enter your API key and model ID.
89
+ - **Ollama:** install and start Ollama separately, download your chosen model,
90
+ and provide an address reachable from the Runtime.
96
91
 
97
- For OpenAI, set `OPENAI_API_KEY` in the generated `.env` and initialize with:
92
+ ABot includes the provider adapters. You supply the model and any required
93
+ credentials. Configuration and runtime state are stored in your project.
98
94
 
99
- ```bash
100
- npx abot init --provider openai --model <model-id>
101
- ```
95
+ Prefer command-line setup or running from source?
96
+ See [Installation](docs/installation.md) and
97
+ [Running Locally](docs/running-locally.md).
102
98
 
103
- OpenAI profiles created by `abot init` or `abot add-model` use the recommended
104
- `execution-agent-v1` execution policy. Existing profiles are preserved unless
105
- the user explicitly requests replacement.
99
+ ## A workspace for everyday agent work
106
100
 
107
- Passive long-term memory is disabled by default. After configuring a provider,
108
- choose and probe an embedding model from **Memory → Setup** or the CLI:
101
+ The included Web UI brings conversations, tools, models, and automation into
102
+ one place.
109
103
 
110
- ```bash
111
- npx abot memory enable --provider <provider-id> --model <embedding-model-id>
112
- ```
104
+ - Organize conversations and projects around working folders.
105
+ - Select models and their supported reasoning settings.
106
+ - Attach files and images, subject to model and tool support.
107
+ - Follow streaming responses, tool activity, results, and failures.
108
+ - Steer an active request, stop it, or queue the next message.
109
+ - Manage plugins, memories, schedules, and runtime configuration.
110
+ - Inspect persisted conversation history, request events, logs, and health.
111
+ - Review notifications and open the conversation or run behind them.
113
112
 
114
- See [Passive Long-Term Memory](docs/long-term-memory.md) for its privacy,
115
- storage, retrieval, and management contracts.
116
- [ABot Spark](docs/long-term-memory.md#learning-from-computer-activity) adds optional
117
- computer-activity learning and proactive suggestions, with separate controls and
118
- daily usage limits. Collection and proactive messages are off by default.
113
+ The default Web UI connects directly to the local Runtime. An external bridge
114
+ is optional.
119
115
 
120
- [Computer access and notifications](docs/installation.md#computer-access-during-setup)
121
- use one paired Companion. Desktop tools require the [SYSTEM platform dependencies
122
- and permissions](plugins/system/README.md#execution-environments).
116
+ ## Tools you can use and extend
123
117
 
124
- ## Quick Start From Source
118
+ The bundled public plugins cover:
125
119
 
126
- From a checkout of this repository:
120
+ | Area | Capabilities |
121
+ |---|---|
122
+ | Files and documents | Read, create, and edit files; extract document content |
123
+ | Development | Inspect projects, code structure, and JSON configuration |
124
+ | Local search | Find relevant content in accessible files |
125
+ | Commands and systems | Execute commands, inspect system information, and discover or launch applications where supported |
126
+ | Web research | Fetch public pages and search supported sources |
127
+ | Explicit memory | Save and retrieve records through dedicated memory tools |
127
128
 
128
- If you are using Ollama, install it and make sure its service is running first.
129
- On the machine that runs Ollama, choose a concrete id from the
130
- [Ollama model library](https://ollama.com/library), then pull and verify that
131
- exact model:
129
+ Select the plugins and tools available to your agent, then extend the catalog
130
+ with your own plugins through the public Plugin SDK.
132
131
 
133
- ```bash
134
- ollama pull <model-id>
135
- curl http://127.0.0.1:11434/api/tags
136
- ```
132
+ Sensitive actions follow the selected approval mode. Tool availability also
133
+ depends on platform support, installed dependencies, and OS permissions.
134
+ Approved commands run with the Runtime user's OS authority; project folders
135
+ are not a shell sandbox.
137
136
 
138
- Then initialize the runtime with the same model id:
137
+ For Web access:
139
138
 
140
- ```bash
141
- npm install
142
- npm run init -- --provider ollama --model <model-id>
143
- ```
139
+ - `web_fetch` retrieves a public HTTP(S) page without a search API key.
140
+ - `web_search` uses Brave Search when `BRAVE_SEARCH_API_KEY` is configured.
141
+ - Without a key, Light search discovers pages within a bounded catalog of
142
+ public sources. Its coverage is more limited than a whole-web search engine.
144
143
 
145
- The command above uses `http://127.0.0.1:11434`. When Ollama is reachable from
146
- the runtime at another address, provide that origin explicitly:
144
+ See [Plugins](docs/plugins.md) and
145
+ [Projects and Permissions](docs/projects-and-full-plus.md).
147
146
 
148
- ```bash
149
- npm run init -- --provider ollama --model <model-id> --base-url http://<ollama-host>:11434
150
- ```
147
+ ## Turn repeated work into automation
151
148
 
152
- The init command creates machine-local configuration, including `.env` and
153
- `local/runtime.config.json`. It also sets `LLM_RUNTIME_CONFIG_FILE` in `.env`
154
- so the local commands use that config. Both the provider and model are explicit.
149
+ ### Scheduled conversation requests
155
150
 
156
- The initializer configures the adapter; it does not install or start Ollama or
157
- download a model. The configured URL must be reachable from the runtime
158
- process. For example, Docker Desktop can usually reach Ollama on its Windows or
159
- macOS host at `http://host.docker.internal:11434`; other WSL, container, and
160
- remote layouts may require a different address.
151
+ Save a request to run later in its conversation, using its saved model and
152
+ permissions. Supported schedules include timers, one-time requests, intervals,
153
+ and daily, weekly, or monthly schedules.
161
154
 
162
- Start the model gateway:
155
+ Manage Jobs in the Web UI or through the model's built-in scheduling capability.
156
+ Each run leaves a record in its conversation.
163
157
 
164
- ```bash
165
- npm run model-gateway
166
- ```
158
+ The Runtime must be running when a Job is due. Missed offline occurrences and
159
+ failed runs are not retried automatically.
167
160
 
168
- Then start the Web UI in another terminal:
161
+ ### ABot Studio
169
162
 
170
- ```bash
171
- npm run web-ui
172
- ```
163
+ Build reusable workflows in a visual editor by combining tool and agent steps.
173
164
 
174
- Open [http://127.0.0.1:5177](http://127.0.0.1:5177).
165
+ Studio supports:
175
166
 
176
- For an OpenAI profile, initialize with:
167
+ - Sequential steps and parallel branches
168
+ - Connected inputs and reusable saved agents
169
+ - Starter templates for research, documents, development, and operations
170
+ - Manual runs, schedules, and folder polling
171
+ - Retained step outputs and execution records
172
+ - Separate draft, publication, activation, pause, and stop controls
177
173
 
178
- ```bash
179
- npm run init -- --provider openai --model <model-id>
180
- ```
174
+ For example, turn incoming documents into briefs, compare several sources,
175
+ or run a repeatable project inspection.
181
176
 
182
- The generated OpenAI model profile opts into `execution-agent-v1`.
177
+ Conversations can help create and edit workflow drafts. Publication, activation,
178
+ and execution remain separate actions.
183
179
 
184
- To add another model to an initialized runtime without replacing existing
185
- providers or profiles, give the new profile a unique id:
180
+ ## Memory that carries useful context forward
186
181
 
187
- ```bash
188
- npm run add-model -- --profile <profile-id> --provider openai --model <model-id>
189
- ```
182
+ Optional long-term memory helps retain selected facts and preferences across
183
+ conversations. Inspect, edit, and delete saved records from the Web UI.
190
184
 
191
- Add `--default` to select the new profile as the request-runner default. This
192
- changes only the default selection; it does not remove existing models.
185
+ Passive memory is disabled by default and requires an embedding model you
186
+ select. Configure it during setup or under **Memory → Setup**.
193
187
 
194
- See [Installation](docs/installation.md) and
195
- [Running Locally](docs/running-locally.md) for complete setup options.
188
+ The explicit memory plugin is a separate tool-based option and does not require
189
+ passive memory to be enabled.
196
190
 
197
- ## Use as a Library
191
+ Runtime storage is local. Data sent for generation or embeddings is processed
192
+ by the provider you configure.
198
193
 
199
- Install the same package in a TypeScript host:
194
+ See [Long-Term Memory](docs/long-term-memory.md).
200
195
 
201
- ```bash
202
- npm install @abot-ai/runtime
203
- ```
196
+ ## SPARK: optional help from computer activity
204
197
 
205
- Compose the runtime from its public API:
198
+ SPARK adds learning from authorized computer activity and proactive suggestions
199
+ in its own persistent conversation.
206
200
 
207
- ```ts
208
- import {
209
- createDefaultRuntimeDependencies,
210
- loadRuntimeConfig,
211
- } from "@abot-ai/runtime/runtime";
201
+ Use it to surface possible next steps from the context you allow it to observe.
202
+ A saved suggestion can open a regular work conversation with its retained
203
+ context; opening it does not start the work automatically.
212
204
 
213
- const config = loadRuntimeConfig({ rootDir: process.cwd() });
214
- const dependencies = createDefaultRuntimeDependencies(config);
215
- ```
205
+ Collection requires explicit consent. Collection, learning, and proactive
206
+ messages have separate controls, with application exclusions and usage limits.
207
+ Collection and proactive messages are off by default.
216
208
 
217
- The host owns startup, shutdown, transport, and process lifecycle. See
218
- [examples/runtime-library-host.ts](examples/runtime-library-host.ts) for a
219
- complete host and [Runtime Library](docs/runtime-library.md) for the supported
220
- API surface.
209
+ Collected content may be sent to the learning model provider you select.
221
210
 
222
- ## Configuration and Providers
211
+ On native Windows, SPARK collection runs locally without Companion pairing.
212
+ Other deployment arrangements may require the shared Computer access setup
213
+ and platform permissions.
223
214
 
224
- The default config path is `runtime.config.json`. A host can instead pass
225
- `configPath` or set `LLM_RUNTIME_CONFIG_FILE`; the source initializer uses this
226
- mechanism to select `local/runtime.config.json`.
215
+ See [SPARK and computer-activity learning](docs/long-term-memory.md#learning-from-computer-activity)
216
+ and [Computer access setup](docs/installation.md#computer-access-during-setup).
227
217
 
228
- Provider profiles, model profiles, request-runner policy, environments, paths,
229
- and optional bridge settings are configuration-driven. Secrets belong in
230
- environment variables or a host secret store, never in committed config.
218
+ ## Embed the same engine in your application
231
219
 
232
- See [Configuration](docs/configuration.md) and the packaged
233
- [`runtime.config.schema.json`](runtime.config.schema.json). Model behavior can
234
- also be tuned per semantic step without adding provider-specific logic to the
235
- runtime; see [Calibrating A Model By
236
- Step](docs/configuration.md#calibrating-a-model-by-step).
220
+ Use ABot as a TypeScript library when you want your own interface, transport,
221
+ or application lifecycle.
237
222
 
238
- ## Plugins and Web Access
223
+ Compose the default services through the public API:
239
224
 
240
- The distribution includes a curated public plugin catalog for development and
241
- agent workflows: filesystem operations, command execution, document reading,
242
- local search, explicit memory operations, project inspection, JSON inspection,
243
- system probing, and Web access. Hosts can add plugins under their own runtime
244
- root; duplicate plugin IDs fail closed. The explicit memory plugin is separate
245
- from core-owned passive long-term memory.
225
+ ```ts
226
+ import {
227
+ createDefaultRuntimeDependencies,
228
+ loadRuntimeConfig,
229
+ } from "@abot-ai/runtime/runtime";
246
230
 
247
- The Web plugin exposes two distinct capabilities:
231
+ const config = loadRuntimeConfig({ rootDir: process.cwd() });
232
+ const runtime = createDefaultRuntimeDependencies(config);
233
+ ```
248
234
 
249
- - `web_fetch` retrieves a specific public HTTP(S) page without a search API key.
250
- - `web_search` uses Brave Search when `BRAVE_SEARCH_API_KEY` is configured.
251
- Without a key, it uses Light search: bounded discovery and ranking within a
252
- catalog of public Hebrew and English sources, without an external search
253
- engine. Light has limited coverage; an empty result does not mean the
254
- information is absent from the web. A configured Brave key that fails does
255
- not trigger an automatic switch to Light.
235
+ This creates the service composition. Your host supplies startup, shutdown,
236
+ and application integration, including a configured model gateway connection.
256
237
 
257
- Some plugins have platform-specific requirements. See [Plugins](docs/plugins.md)
258
- for their contracts, limits, and configuration.
238
+ Use the default services or provide adapters for models, session storage,
239
+ tools, attachments, and events.
259
240
 
260
- ## Architecture at a Glance
241
+ See the [complete host example](examples/runtime-library-host.ts),
242
+ [Runtime Library guide](docs/runtime-library.md), and
243
+ [public contracts](docs/runtime-public-contracts.md).
261
244
 
262
- - The runtime owns request execution, sessions, events, context, and capability
263
- orchestration.
264
- - The model gateway normalizes provider adapters, model profiles, and streaming
265
- responses behind one runtime-facing contract.
266
- - Plugins own tool implementations and declare their capabilities, operations,
267
- parameters, skills, and required secrets.
268
- - The Web UI and bridge are clients of the same runtime contracts.
245
+ ## Platforms and current scope
269
246
 
270
- For a deeper view, see [Architecture](docs/architecture.md).
247
+ ABot is available as an npm package with a browser-based Web UI on Windows,
248
+ Linux, and macOS, with separate WSL and Docker setup paths.
271
249
 
272
- ## Documentation
250
+ The [1.8.0 release](https://github.com/Dorshitrit/abot-runtime/releases/tag/v1.8.0)
251
+ includes native Windows support for the Runtime and the documented operations of
252
+ its bundled plugins. SYSTEM provides commands and application discovery and
253
+ launch; desktop observation and input (`computer_*`) are unavailable on native
254
+ Windows. Tool requirements, permissions, and limits still apply.
273
255
 
274
- - [Installation](docs/installation.md)
275
- - [Running Locally](docs/running-locally.md)
276
- - [Configuration](docs/configuration.md)
277
- - [Runtime Library](docs/runtime-library.md)
278
- - [Passive Long-Term Memory](docs/long-term-memory.md)
279
- - [Plugins](docs/plugins.md)
280
- - [Troubleshooting](docs/troubleshooting.md)
256
+ The separate desktop shell remains in QA and is not included in npm or the
257
+ public source snapshot.
281
258
 
282
- ## Project Status
259
+ ABot Runtime is an early-stage project. The documented package exports define
260
+ its supported API; internal source paths may change between releases.
283
261
 
284
- ABot Runtime is an early-stage project. Only documented package exports are
285
- part of its supported API; internal source paths may change between releases.
262
+ See [platform-specific plugin support](docs/plugins.md#native-windows-plugin-support)
263
+ and [Known Limitations](docs/known-limitations.md).
286
264
 
287
- ## Contributing, Security, and License
265
+ ## Documentation
288
266
 
289
- See [CONTRIBUTING.md](CONTRIBUTING.md) for development guidelines and
290
- [SECURITY.md](SECURITY.md) for reporting vulnerabilities. ABot Runtime is
291
- available under the [MIT License](LICENSE).
267
+ | Goal | Guide |
268
+ |---|---|
269
+ | Install ABot or run from source | [Installation](docs/installation.md) |
270
+ | Configure local services | [Running Locally](docs/running-locally.md) |
271
+ | Select models and execution policies | [Configuration](docs/configuration.md) |
272
+ | Use and build plugins | [Plugins](docs/plugins.md) |
273
+ | Understand projects and permissions | [Projects and FULL+](docs/projects-and-full-plus.md) |
274
+ | Configure memory and SPARK | [Long-Term Memory](docs/long-term-memory.md) |
275
+ | Embed the runtime | [Runtime Library](docs/runtime-library.md) |
276
+ | Understand the engine | [Architecture](docs/architecture.md) |
277
+ | Check operational boundaries | [Known Limitations](docs/known-limitations.md) |
278
+ | Diagnose setup and runtime issues | [Troubleshooting](docs/troubleshooting.md) |
279
+
280
+ ## Contributing, security, and license
281
+
282
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for contribution guidelines and
283
+ [SECURITY.md](SECURITY.md) for reporting vulnerabilities.
284
+
285
+ ABot Runtime is available under the [MIT License](LICENSE).
292
286
 
293
287
  ## Acknowledgements
294
288
 
@@ -9,6 +9,7 @@ export function parseToolDefinition(raw) {
9
9
  }
10
10
  const name = raw.name;
11
11
  const pluginName = raw.pluginName;
12
+ const pluginDescription = raw.pluginDescription;
12
13
  const description = raw.description;
13
14
  const routingCapability = raw.routingCapability;
14
15
  const controlsRefinement = raw.controlsRefinement;
@@ -27,6 +28,9 @@ export function parseToolDefinition(raw) {
27
28
  (typeof pluginName !== "string" || pluginName.trim().length === 0)) {
28
29
  throw new Error(`Invalid tool definition for ${name} (pluginName)`);
29
30
  }
31
+ if (!hasSupportedPluginDescription(pluginDescription)) {
32
+ throw new Error(`Invalid tool definition for ${name} (pluginDescription)`);
33
+ }
30
34
  if (!isRoutingCapability(routingCapability)) {
31
35
  throw new Error(`Invalid tool definition for ${name} (routingCapability)`);
32
36
  }
@@ -55,6 +59,7 @@ export function parseToolDefinition(raw) {
55
59
  return {
56
60
  name,
57
61
  ...(typeof pluginName === "string" ? { pluginName } : {}),
62
+ ...(typeof pluginDescription === "string" ? { pluginDescription } : {}),
58
63
  requiredPermissionMode: parseRequiredToolPermissionMode(raw.requiredPermissionMode, `${name}.requiredPermissionMode`),
59
64
  ...(typeof description === "string" ? { description } : {}),
60
65
  routingCapability,
@@ -82,3 +87,6 @@ function hasSupportedDevelopmentRoles(value) {
82
87
  return false;
83
88
  return value.every(isDevelopmentRole);
84
89
  }
90
+ function hasSupportedPluginDescription(value) {
91
+ return value === undefined || typeof value === "string";
92
+ }
@@ -107,6 +107,8 @@ export type ToolDefinition = {
107
107
  name: string;
108
108
  /** Runtime-owned provenance used when presenting tools by plugin. */
109
109
  pluginName?: string;
110
+ /** Optional manifest-owned plugin description for passive discovery. */
111
+ pluginDescription?: string;
110
112
  description?: string;
111
113
  routingCapability: ToolRoutingCapability;
112
114
  controlsRefinement?: ToolControlsRefinement;
@@ -143,6 +145,8 @@ export type ToolRequestAttachment = Readonly<{
143
145
  /** Minimal config-filtered tool fact; consumers project it for their own context. */
144
146
  export type ToolAvailabilityEntry = Readonly<{
145
147
  toolName: string;
148
+ pluginName?: string;
149
+ pluginDescription?: string;
146
150
  operationId: string;
147
151
  summary: string;
148
152
  catalogGroups: readonly ToolCatalogGroup[];
@@ -6,6 +6,7 @@ export declare function isModelGatewayToolCall(value: unknown): value is ModelGa
6
6
  export declare function isAssistantToolCallMessage(value: unknown): value is ChatAssistantToolCallMessage;
7
7
  export declare function isToolResultMessage(value: unknown): value is ChatToolResultMessage;
8
8
  export declare function isTextChatMessage(value: unknown): value is ChatTextMessage;
9
+ export declare function isStrictTextChatMessage(value: unknown): value is ChatTextMessage;
9
10
  export declare function hasModelGatewayToolInteractionLane(value: unknown): boolean;
10
11
  /**
11
12
  * Enforces the native tool-call continuation protocol whenever any tool-lane
@@ -115,7 +115,7 @@ export function isTextChatMessage(value) {
115
115
  typeof value.content === "string" &&
116
116
  !Object.prototype.hasOwnProperty.call(value, "toolCalls"));
117
117
  }
118
- function isStrictTextChatMessage(value) {
118
+ export function isStrictTextChatMessage(value) {
119
119
  if (!isRecord(value) ||
120
120
  !hasOnlyKeys(value, TEXT_MESSAGE_KEYS) ||
121
121
  !isTextChatMessage(value)) {
@@ -1,5 +1,6 @@
1
1
  import { resolveModelInvocation } from "../policy/invocation-policy.js";
2
2
  import { respondToGatewayHandlerError } from "./errors.js";
3
+ import { writeChatStreamResponse } from "./chat-stream-response.js";
3
4
  import { sendText } from "./http-response.js";
4
5
  import { applyConfiguredModelPolicy, emitResolvedModelInvocation, validateImageInvocationSupport, validateMessageInteractionRequest, } from "./invocation-validation.js";
5
6
  import { createContextGuardedProviderFetch } from "./provider-fetch.js";
@@ -62,14 +63,11 @@ export function createChatHandler(options = {}, inputTokenMeasurements) {
62
63
  if (result.kind !== "chat") {
63
64
  throw new Error("model_provider_adapter_chat_result_invalid");
64
65
  }
65
- response.setHeader("Content-Type", "application/x-ndjson; charset=utf-8");
66
- response.setHeader("Cache-Control", "no-cache");
67
- await result.stream({
68
- emit(event) {
69
- response.write(`${JSON.stringify(event)}\n`);
70
- },
66
+ await writeChatStreamResponse({
67
+ invocation: result,
68
+ response,
69
+ abortSignal,
71
70
  });
72
- response.end();
73
71
  }
74
72
  catch (error) {
75
73
  respondToGatewayHandlerError({
@@ -0,0 +1,7 @@
1
+ import type { ModelProviderChatInvocation } from "../providers/contracts.js";
2
+ import type { GatewayResponse } from "./contracts.js";
3
+ export declare function writeChatStreamResponse(params: {
4
+ invocation: ModelProviderChatInvocation;
5
+ response: GatewayResponse;
6
+ abortSignal: AbortSignal;
7
+ }): Promise<void>;