workspai 0.77.0 → 0.79.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/contracts/create-planner-capabilities.v1.json +27 -3
- package/contracts/runtime-command-surface.v1.json +2 -0
- package/contracts/workspace-intelligence-architecture.v1.json +2 -0
- package/dist/analyze-SKOIUD6F.js +1 -0
- package/dist/autopilot-release-MDMVMU67.js +1 -0
- package/dist/{chunk-UP3UWAJV.js → chunk-2ZVE7VE2.js} +1 -1
- package/dist/{chunk-47UR6ZH4.js → chunk-3O344BX3.js} +1 -1
- package/dist/{chunk-IDETNYCF.js → chunk-4H3VNKOJ.js} +1 -1
- package/dist/{chunk-LUPKDFQ3.js → chunk-7EMG3C3H.js} +2 -2
- package/dist/{chunk-O3TVVQ6X.js → chunk-7HV4U2OV.js} +1 -1
- package/dist/{chunk-DWKCFHHL.js → chunk-7MIOAM4A.js} +1 -1
- package/dist/{chunk-E7WJ2QX7.js → chunk-7SN4V3RC.js} +1 -1
- package/dist/{chunk-X5XFT5UZ.js → chunk-BGUCDG5N.js} +1 -1
- package/dist/{chunk-IAXRGH4Q.js → chunk-CJBDYDVC.js} +1 -1
- package/dist/{chunk-UTIK3K3M.js → chunk-EPFEUMYF.js} +1 -1
- package/dist/{chunk-4CXV3PPV.js → chunk-ETTZXKAS.js} +1 -1
- package/dist/{chunk-V6HVDVKJ.js → chunk-FVG5FBA4.js} +5 -5
- package/dist/{chunk-J2MPBSQJ.js → chunk-GUCZOQUS.js} +1 -1
- package/dist/{chunk-SC43A6LH.js → chunk-H24MEOML.js} +50 -50
- package/dist/{chunk-ZIWWE4BQ.js → chunk-HXTNPR3M.js} +1 -1
- package/dist/chunk-ICPL4WNK.js +2 -0
- package/dist/{chunk-475GQJ2D.js → chunk-KRTVIBPC.js} +1 -1
- package/dist/{chunk-GLBFY7AB.js → chunk-KTOKU6HQ.js} +2 -2
- package/dist/{chunk-QCX6BO2M.js → chunk-MNZAJ6PP.js} +1 -1
- package/dist/chunk-O4TZKLEC.js +1 -0
- package/dist/{chunk-HRVHQBTA.js → chunk-R7R5FX4B.js} +1 -1
- package/dist/chunk-RQXZF7BZ.js +1 -0
- package/dist/{chunk-UNEK3VVR.js → chunk-RRZQPFFR.js} +2171 -109
- package/dist/{chunk-3EPR3D5Q.js → chunk-SKHRUHXO.js} +1 -1
- package/dist/{chunk-WC2K5QFI.js → chunk-SV7X5LJW.js} +1 -1
- package/dist/{chunk-TGNPMOM6.js → chunk-TQW2SZHH.js} +1 -1
- package/dist/{chunk-JVZA35OL.js → chunk-U5WP4HDH.js} +1 -1
- package/dist/{chunk-223SWPTL.js → chunk-VT4WPXTO.js} +1 -1
- package/dist/chunk-WU5M6UP7.js +2 -0
- package/dist/{chunk-3EMAC3MF.js → chunk-ZDLF77IS.js} +1 -1
- package/dist/{chunk-3SQIV3F4.js → chunk-ZONAHZBG.js} +1 -1
- package/dist/{create-YPAZJYCE.js → create-M3TWRHV6.js} +1 -1
- package/dist/{doctor-W5PXJ5FL.js → doctor-FF3WLJSP.js} +1 -1
- package/dist/{goal-lifecycle-5R55CA7H.js → goal-lifecycle-O4MYYTRU.js} +1 -1
- package/dist/{goal-pack-IS6GGJPH.js → goal-pack-NUDKANPM.js} +1 -1
- package/dist/index.js +92 -91
- package/dist/{pipeline-LW3SW2WT.js → pipeline-V5P2FX2P.js} +1 -1
- package/dist/{project-agent-entry-5TYKK5IV.js → project-agent-entry-6O7FKWSL.js} +1 -1
- package/dist/{project-intelligence-lens-TEOSTKNU.js → project-intelligence-lens-OQTZ4K7L.js} +1 -1
- package/dist/{project-test-coverage-T4TIWGKN.js → project-test-coverage-EJ3MBSZ3.js} +1 -1
- package/dist/{proof-carrying-change-2TKRADCW.js → proof-carrying-change-GV37YLDQ.js} +1 -1
- package/dist/{verified-goal-RN4TOV34.js → verified-goal-VB7IOTNO.js} +1 -1
- package/dist/{workspace-A33YMF2N.js → workspace-AXU6ODER.js} +1 -1
- package/dist/{workspace-agent-sync-VCA4G4DT.js → workspace-agent-sync-6427FNME.js} +1 -1
- package/dist/{workspace-context-YBWLSKR6.js → workspace-context-VVZARI5K.js} +1 -1
- package/dist/{workspace-contract-3QUZDBMM.js → workspace-contract-N2BJCAJ7.js} +1 -1
- package/dist/{workspace-explain-NXYRAQFI.js → workspace-explain-5WKK6ENK.js} +1 -1
- package/dist/{workspace-foundation-DZ52PECX.js → workspace-foundation-GYL3D7TW.js} +1 -1
- package/dist/{workspace-graph-stream-4VT46HZ7.js → workspace-graph-stream-26ME2JJS.js} +1 -1
- package/dist/{workspace-intelligence-FKYQQDJ6.js → workspace-intelligence-ZTET7JHS.js} +1 -1
- package/dist/{workspace-intelligence-runner-3K2JZH6Q.js → workspace-intelligence-runner-2EJ7GXG5.js} +1 -1
- package/dist/{workspace-knowledge-graph-CPBKNXQI.js → workspace-knowledge-graph-4RSZTEFJ.js} +1 -1
- package/dist/workspace-knowledge-graph-snapshot-UTJHALST.js +1 -0
- package/dist/{workspace-mcp-serve-UXPKX7K6.js → workspace-mcp-serve-BSA6Q4EB.js} +1 -1
- package/dist/{workspace-model-POCPMNRT.js → workspace-model-LBICKRVI.js} +1 -1
- package/dist/{workspace-onboarding-KLG3GG7S.js → workspace-onboarding-NH4WFJ5N.js} +1 -1
- package/dist/{workspace-registry-summary-M4WMFDQ4.js → workspace-registry-summary-3PXZENLC.js} +1 -1
- package/dist/{workspace-repair-engine-2VGN42QD.js → workspace-repair-engine-ODTFFM6O.js} +1 -1
- package/dist/workspace-run-VDQ6BYLS.js +1 -0
- package/dist/{workspace-verify-PLAKTF3J.js → workspace-verify-UQWAFGNQ.js} +1 -1
- package/dist/{workspace-watch-VNU4KVYN.js → workspace-watch-BKIZQ2SM.js} +1 -1
- package/docs/agent-framework-adapters.md +88 -32
- package/docs/ci-workflows.md +10 -7
- package/docs/commands-reference.md +13 -9
- package/docs/create-planner-capabilities.md +1 -1
- package/docs/creating-workspaces-and-projects.md +24 -20
- package/docs/doctor-command.md +5 -3
- package/docs/model-gateways.md +23 -23
- package/docs/native-kit-baselines.md +2 -2
- package/package.json +4 -1
- package/scripts/enterprise-package-smoke.mjs +50 -0
- package/dist/analyze-TJM66CPF.js +0 -1
- package/dist/autopilot-release-C7Q4OTPY.js +0 -1
- package/dist/chunk-5KXOV7W4.js +0 -1
- package/dist/chunk-IHWS3ALP.js +0 -2
- package/dist/chunk-N7DOKE7V.js +0 -2
- package/dist/chunk-SEZTSMRR.js +0 -1
- package/dist/workspace-knowledge-graph-snapshot-67XDXUOT.js +0 -1
- package/dist/workspace-run-5YQR7GEZ.js +0 -1
|
@@ -100,15 +100,15 @@ verified from the Microsoft source tree:
|
|
|
100
100
|
|
|
101
101
|
| Adapter | Tested framework | Runtime | Authored detection |
|
|
102
102
|
| ---------------------------------- | ---------------- | --------------- | ------------------------------------------ |
|
|
103
|
-
| `microsoft-agent-framework-python` | `1.
|
|
104
|
-
| `microsoft-agent-framework-dotnet` | `1.
|
|
103
|
+
| `microsoft-agent-framework-python` | `1.19.0` | Python `>=3.10` | `agent-framework` PyPI package family |
|
|
104
|
+
| `microsoft-agent-framework-dotnet` | `1.22.0` | .NET `>=8.0` | `Microsoft.Agents.AI` NuGet package family |
|
|
105
105
|
|
|
106
106
|
The first provider profile pins its integration independently: Python uses
|
|
107
|
-
`agent-framework-foundry` `1.13.
|
|
108
|
-
`Microsoft.Agents.AI.Foundry` `1.
|
|
109
|
-
`Microsoft.Agents.AI` `1.
|
|
107
|
+
`agent-framework-foundry` `1.13.1`, while .NET uses
|
|
108
|
+
`Microsoft.Agents.AI.Foundry` `1.22.0-preview.260918.1` over the stable
|
|
109
|
+
`Microsoft.Agents.AI` `1.22.0` core. Preview integration status is not
|
|
110
110
|
misrepresented as framework stability. The dedicated .NET test project pins
|
|
111
|
-
`Microsoft.NET.Test.Sdk` `18.10.
|
|
111
|
+
`Microsoft.NET.Test.Sdk` `18.10.1` and `xunit.v3.mtp-v2` `4.0.1`.
|
|
112
112
|
|
|
113
113
|
Each adapter implements detection, scaffold and attach planning, managed-file
|
|
114
114
|
rendering, project context, validation, and runtime resolution. It never
|
|
@@ -129,7 +129,9 @@ Loaders share the OpenAI containment contract: canonical path walk, regular-file
|
|
|
129
129
|
open, 128 KiB cap, UTF-8 JSON, and `schemaVersion: project-context-agent.v1`.
|
|
130
130
|
The Python starter is pip-editable (`[build-system]` + setuptools modules) and
|
|
131
131
|
uses the official Foundry hello-world `Agent(client=FoundryChatClient(...))`
|
|
132
|
-
pattern
|
|
132
|
+
pattern. Agent execution enters the SDK agent as an async context manager so
|
|
133
|
+
framework resources are closed according to the current upstream lifecycle.
|
|
134
|
+
The starter exposes three read-only documented tools: `describe_workspai_context`,
|
|
133
135
|
`read_workspai_project_summary`, and `list_workspai_supported_commands`. The
|
|
134
136
|
.NET starter uses `AIProjectClient.AsAIAgent` plus `AIFunctionFactory.Create`,
|
|
135
137
|
enables `RestorePackagesWithLockFile`, and does not emit invented NuGet lock
|
|
@@ -168,11 +170,11 @@ not reuse Microsoft detection, kits, or model-provider defaults.
|
|
|
168
170
|
|
|
169
171
|
| Adapter | Tested framework | Runtime | Authored detection |
|
|
170
172
|
| -------------------------- | ---------------- | --------------- | ---------------------------------- |
|
|
171
|
-
| `openai-agents-python` | `0.22.
|
|
173
|
+
| `openai-agents-python` | `0.22.3` | Python `>=3.10` | exact PyPI package `openai-agents` |
|
|
172
174
|
| `openai-agents-typescript` | `0.18.0` | Node.js `>=22` | exact npm package `@openai/agents` |
|
|
173
175
|
|
|
174
|
-
The TypeScript starter also pins peer `zod` `4.6.5`, TypeScript `
|
|
175
|
-
`@types/node` `
|
|
176
|
+
The TypeScript starter also pins peer `zod` `4.6.5`, TypeScript `7.0.2`, and
|
|
177
|
+
`@types/node` `26.6.3`. The `openai` PyPI or npm package alone is not this
|
|
176
178
|
framework. Generated markers under `.workspai/agent-frameworks/` cannot select
|
|
177
179
|
it.
|
|
178
180
|
|
|
@@ -205,7 +207,7 @@ Claimed capabilities are conservative and independently evidenced:
|
|
|
205
207
|
hosted tools, and human-approval loops
|
|
206
208
|
|
|
207
209
|
Python cancellation uses `Runner.max_turns` and `ModelSettings.timeout` from
|
|
208
|
-
`openai-agents` `0.22.
|
|
210
|
+
`openai-agents` `0.22.3`. `ModelSettings.timeout` is a per-model-request
|
|
209
211
|
timeout applied only on the live model path. Injected `ScriptedModel` runs omit
|
|
210
212
|
it because that setting hung the official test double on Python 3.13.
|
|
211
213
|
TypeScript cancellation uses `maxTurns` plus `AbortSignal` from
|
|
@@ -233,20 +235,71 @@ workspace profile. A later adapter-manifest change must not hide a kit.
|
|
|
233
235
|
Create and Attach still refuse a kit whose adapter is not release-admitted;
|
|
234
236
|
visibility in the picker is not permission to write a blocked adapter.
|
|
235
237
|
Attach still requires `--framework openai-agents` when the
|
|
236
|
-
runtime is shared. OpenAI adapters are labeled `stable`;
|
|
237
|
-
|
|
238
|
+
runtime is shared. OpenAI adapters are labeled `stable`; Python `0.22.3` and
|
|
239
|
+
TypeScript `0.18.0` are release-admitted from the complete reviewed matrix.
|
|
238
240
|
Handoffs, MCP, sessions, voice, sandbox, and approval loops stay unsupported.
|
|
239
241
|
Microsoft adapters remain `preview`.
|
|
240
242
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
243
|
+
## Google Agent Development Kit baseline
|
|
244
|
+
|
|
245
|
+
Google ADK is an agent runtime and orchestration framework. It is not an AI
|
|
246
|
+
Gateway, not OpenRouter, and not a Gemini/Vertex model-provider product.
|
|
247
|
+
Provider profiles in the generated starter are `gemini-api` (Gemini Developer
|
|
248
|
+
API) and `vertex-ai`. OpenRouter stays in the separate Gateway category.
|
|
249
|
+
|
|
250
|
+
Python `google-adk` and TypeScript `@google/adk` are independent runtimes.
|
|
251
|
+
Exact pins live in `src/agent-frameworks/version-baselines.v1.json`. Discovery
|
|
252
|
+
must re-prove registry and GitHub agreement on the day it runs; TypeScript 2.0
|
|
253
|
+
graph Workflow Runtime is not generalized to Python.
|
|
254
|
+
|
|
255
|
+
| Adapter | Runtime | Authored detection |
|
|
256
|
+
| ----------------------- | ----------------- | ------------------------------- |
|
|
257
|
+
| `google-adk-python` | Python `>=3.10` | exact PyPI package `google-adk` |
|
|
258
|
+
| `google-adk-typescript` | Node.js `>=20.19` | exact npm package `@google/adk` |
|
|
259
|
+
|
|
260
|
+
The Python baseline is `google-adk` `2.10.0`. The TypeScript baseline is
|
|
261
|
+
`@google/adk` `2.1.0` with `zod` `4.6.5`, TypeScript `7.0.2`, and
|
|
262
|
+
`@types/node` `26.6.3`. `@google/adk-devtools` is not a v1 dependency. Do not
|
|
263
|
+
run unqualified `npx adk`.
|
|
264
|
+
|
|
265
|
+
Adapters are labeled `preview`. Create kits are `agent.google-adk.python` and
|
|
266
|
+
`agent.google-adk.typescript`. Python `2.10.0` and TypeScript `2.1.0` are
|
|
267
|
+
admitted by the reviewed v2 Linux, macOS, and Windows evidence. The generic
|
|
268
|
+
admission boundary refuses any unpublished or drifted kit before
|
|
269
|
+
`--dry-run` and before filesystem or workspace mutation. Generated Python code
|
|
270
|
+
uses the current ADK lifecycle: construct `App(root_agent=...)`, pass that app
|
|
271
|
+
to `Runner`, and enter the runner as an async context manager.
|
|
272
|
+
Streaming emits `event.partial` fragments as
|
|
273
|
+
display deltas. The SDK-recognized final response is retained as canonical text
|
|
274
|
+
and is not re-emitted after streamed fragments. Intermediate metadata does not
|
|
275
|
+
close the fragment window; tool-call and function-response events do. Telemetry
|
|
276
|
+
stays off unless `WORKSPAI_AGENT_TRACING=1` is set from process startup;
|
|
277
|
+
otherwise the starter sets `OTEL_SDK_DISABLED=true` before importing ADK. That
|
|
278
|
+
env var is process-global, so the generated starter is an isolated CLI process
|
|
279
|
+
and must not be imported into a host that still needs OpenTelemetry.
|
|
280
|
+
Credentialless conformance observes a non-recording span in a process without
|
|
281
|
+
opt-in and a recording span in a separate opted-in process with a test
|
|
282
|
+
TracerProvider. Context loaders live
|
|
283
|
+
in `src/agent-frameworks/context-loaders/` and are shared by Google, OpenAI, and
|
|
284
|
+
Microsoft adapters. Sequential, parallel, loop, graph workflow, A2A, MCP, Agent Engine,
|
|
285
|
+
Cloud Run, GKE, Google Search, voice, browser agents, and remote agents are
|
|
286
|
+
unsupported. In-memory sessions are process-local, not durable persistence.
|
|
287
|
+
|
|
288
|
+
Credentialless conformance subclasses the public `BaseLlm` surface. It does not
|
|
289
|
+
monkey-patch private SDK internals and does not call Gemini or Vertex.
|
|
290
|
+
|
|
291
|
+
A path-filtered PR gate compiles only the affected Microsoft, OpenAI, or Google
|
|
292
|
+
adapter family on Linux. Shared lifecycle, security, registry, admission,
|
|
293
|
+
Create/Doctor integration, and contract changes select the affected families;
|
|
294
|
+
documentation-only edits do not run adapter conformance. The complete matrix is
|
|
295
|
+
an explicit release-qualification operation: it compiles every built-in adapter runtime on Linux,
|
|
296
|
+
macOS, and Windows. Every full-qualification lane
|
|
247
297
|
records all 18 mandatory checks, the exact runtime and framework baseline,
|
|
248
298
|
digests of the adapter manifest and semantic implementation, and one bounded
|
|
249
|
-
evidence file per check.
|
|
299
|
+
evidence file per check. Google ADK `verification-binding` evidence records
|
|
300
|
+
`streamingPartialSemantics`, `streamingMetadataInterleaving`,
|
|
301
|
+
`streamingToolBoundary`, `telemetryDefaultNonRecording`, and
|
|
302
|
+
`telemetryOptInRecording` as distinct booleans. Reports are retained as CI artifacts for review. A
|
|
250
303
|
final job validates every evidence path and emits an admission candidate only
|
|
251
304
|
when all three operating-system lanes pass for every built-in adapter.
|
|
252
305
|
Python conformance is pinned to 3.10.11, the final Python 3.10 release with
|
|
@@ -291,10 +344,11 @@ npx workspai agent framework plan \
|
|
|
291
344
|
--name support-agent
|
|
292
345
|
```
|
|
293
346
|
|
|
294
|
-
When more than one
|
|
347
|
+
When more than one published framework shares a runtime, pass `--framework`
|
|
295
348
|
explicitly. Workspai does not guess or fall back. `--runtime python` without
|
|
296
|
-
`--framework`
|
|
297
|
-
|
|
349
|
+
`--framework` requires an explicit choice because Microsoft Agent Framework,
|
|
350
|
+
OpenAI Agents SDK, and Google ADK are all published. A published choice may
|
|
351
|
+
still be blocked when its current baseline is not release-admitted.
|
|
298
352
|
|
|
299
353
|
The interactive attach command displays the same plan and asks before granting
|
|
300
354
|
its filesystem effect. Automation must opt in with `--yes` and records the
|
|
@@ -323,7 +377,8 @@ consequences rather than unrelated surprises. A blocked or no-op
|
|
|
323
377
|
request created without an external Goal closes its generated Change and Goal
|
|
324
378
|
instead of leaving actionable lifecycle state behind.
|
|
325
379
|
|
|
326
|
-
The same
|
|
380
|
+
The same admission-governed lifecycle is available for a new project when the
|
|
381
|
+
selected baseline is currently admitted:
|
|
327
382
|
|
|
328
383
|
```bash
|
|
329
384
|
npx workspai create project agent.microsoft.python support-agent
|
|
@@ -401,12 +456,12 @@ and unadvertised runtimes fail closed.
|
|
|
401
456
|
|
|
402
457
|
The generic boundary was hardened against two deliberately different
|
|
403
458
|
integration shapes: a filesystem-first Node.js framework and the
|
|
404
|
-
multi-language Microsoft Agent Framework. OpenAI Agents SDK
|
|
405
|
-
TypeScript adapters
|
|
406
|
-
and verification host. They are selectable for Create and Attach
|
|
407
|
-
their exact manifest digest, framework baseline, runtime, and
|
|
408
|
-
|
|
409
|
-
|
|
459
|
+
multi-language Microsoft Agent Framework. OpenAI Agents SDK and Google ADK
|
|
460
|
+
Python and TypeScript adapters share that same create, attach, detection,
|
|
461
|
+
ownership, and verification host. They are selectable for Create and Attach
|
|
462
|
+
only while their exact manifest digest, framework baseline, runtime, and
|
|
463
|
+
platform list remain in the reviewed release-admission inventory. All six
|
|
464
|
+
current baselines are admitted by Agent Framework Adapter Matrix run 88.
|
|
410
465
|
|
|
411
466
|
## Implementation sequence
|
|
412
467
|
|
|
@@ -415,8 +470,9 @@ selectable while their current inventory entries stay valid.
|
|
|
415
470
|
2. Use the framework-neutral registry, detector, and bounded manifest loader.
|
|
416
471
|
3. Review the Microsoft Python and .NET digest-bound evidence produced by the
|
|
417
472
|
full conformance matrix.
|
|
418
|
-
4. Review the OpenAI Python and TypeScript digest-bound evidence
|
|
419
|
-
the same matrix; do not treat local Linux success as multi-OS
|
|
473
|
+
4. Review the OpenAI and Google Python and TypeScript digest-bound evidence
|
|
474
|
+
produced by the same matrix; do not treat local Linux success as multi-OS
|
|
475
|
+
admission.
|
|
420
476
|
5. Keep automated upstream discovery separate from release authority: report
|
|
421
477
|
newer registry versions, then update pins only through a reviewed change.
|
|
422
478
|
Re-run the full matrix before treating a new pin as independently proven.
|
package/docs/ci-workflows.md
CHANGED
|
@@ -13,7 +13,7 @@ Map of GitHub Actions workflows in this repository. Use this when editing CI to
|
|
|
13
13
|
| Official generator smoke | `.github/workflows/frontend-generator-smoke.yml` | Contract-driven official-generator drift gate |
|
|
14
14
|
| Agent Framework matrix | `.github/workflows/agent-framework-conformance.yml` | Affected-family Linux PR gate plus manual twelve-lane release qualification and admission |
|
|
15
15
|
| Agent Framework discovery | `.github/workflows/agent-framework-version-discovery.yml` | Weekly PyPI/NuGet candidate report; no commit, PR, or contract rewrite |
|
|
16
|
-
| Model Gateway matrix | `.github/workflows/model-gateway-qualification.yml` | Three-OS generated-project and lifecycle qualification; manual fast mode stays on Linux
|
|
16
|
+
| Model Gateway matrix | `.github/workflows/model-gateway-qualification.yml` | Three-OS generated-project and lifecycle qualification; manual fast mode stays on Linux |
|
|
17
17
|
| Model Gateway discovery | `.github/workflows/model-gateway-version-discovery.yml` | Weekly npm/PyPI/GitHub candidate report; no baseline write, commit, or PR |
|
|
18
18
|
| Security | `.github/workflows/security.yml` | Path-aware scanning plus the always-resolved `Security Gate` |
|
|
19
19
|
| Manual npm release | `.github/workflows/release-npm-manual.yml` | Maintainer-only release gate and publish workflow |
|
|
@@ -29,15 +29,15 @@ a report and artifact. It does not commit, open a pull request, regenerate
|
|
|
29
29
|
Create contracts, or write `release-admissions.v2.json`. A human pin update
|
|
30
30
|
still has to pass the manual `full` mode of `agent-framework-conformance` on
|
|
31
31
|
Linux, macOS, and Windows for every built-in adapter runtime. Pull requests run
|
|
32
|
-
the faster Linux gate only for the affected Microsoft or
|
|
33
|
-
agent-framework surfaces select
|
|
34
|
-
specialized workflow. The full matrix compiles the nested `agents/primary`
|
|
32
|
+
the faster Linux gate only for the affected Microsoft, OpenAI, or Google family;
|
|
33
|
+
shared agent-framework surfaces select the affected families, while documentation-only
|
|
34
|
+
changes skip the specialized workflow. The full matrix compiles the nested `agents/primary`
|
|
35
35
|
runtime, runs credentialless context-boundary tests, and records manifest-bound
|
|
36
36
|
admission data plus semantic implementation provenance. Promotion requires the
|
|
37
37
|
candidate source commit to equal the checked-out promotion commit. An
|
|
38
38
|
implementation digest is audit evidence, not a runtime lock and not a manual
|
|
39
39
|
maintenance requirement after every routine adapter edit.
|
|
40
|
-
It never sets Foundry or
|
|
40
|
+
It never sets Foundry, OpenAI, Gemini, or Vertex credentials. Only a reviewed admission on the protected
|
|
41
41
|
version-update branch can promote a green candidate.
|
|
42
42
|
|
|
43
43
|
OpenRouter AI Gateway kits are not part of the Agent Framework conformance
|
|
@@ -113,7 +113,10 @@ cross-platform qualification is needed. npm and Composer download caches reduce
|
|
|
113
113
|
repeated network work without treating an earlier commit or calendar-day result
|
|
114
114
|
as proof for a new SHA.
|
|
115
115
|
|
|
116
|
-
|
|
116
|
+
Linux is the only matrix job that collects V8 coverage, and that report is
|
|
117
|
+
text plus `coverage-final.json`. macOS and Windows run the same suite without
|
|
118
|
+
coverage instrumentation and without a second `tsup`, because the job build
|
|
119
|
+
already produced `dist`. The Windows test lane intentionally uses bounded Vitest worker concurrency
|
|
117
120
|
and platform-aware transaction timeouts. Filesystem-heavy workspace tests must
|
|
118
121
|
finish their transaction before teardown; cleanup retries transient Windows
|
|
119
122
|
`EBUSY`, `ENOTEMPTY`, and `EPERM` states instead of converting one slow operation into a
|
|
@@ -136,7 +139,7 @@ Validate or preview the current CLI announcement locally:
|
|
|
136
139
|
npm --workspace workspai run check:release-announcement
|
|
137
140
|
npm --workspace workspai run release:announcement -- \
|
|
138
141
|
--product workspai-cli \
|
|
139
|
-
--tag v0.
|
|
142
|
+
--tag v0.79.0 \
|
|
140
143
|
--markdown-output /tmp/workspai-discord-announcement.md
|
|
141
144
|
```
|
|
142
145
|
|
|
@@ -278,9 +278,12 @@ See [Canonical-first agent entry](./agent-entry.md).
|
|
|
278
278
|
|
|
279
279
|
`agent framework` is the governed bridge between Workspai evidence and an
|
|
280
280
|
agent runtime. `list` exposes every built-in adapter and its release-admission
|
|
281
|
-
state. In this CLI version Microsoft Python `1.
|
|
282
|
-
`preview`. OpenAI Agents SDK Python `0.22.
|
|
283
|
-
labeled `stable`.
|
|
281
|
+
state. In this CLI version Microsoft Python `1.19.0` and .NET `1.22.0` remain
|
|
282
|
+
`preview`. OpenAI Agents SDK Python `0.22.3` and TypeScript `0.18.0` are
|
|
283
|
+
labeled `stable`. Google ADK Python `2.10.0` and TypeScript `2.1.0` remain
|
|
284
|
+
labeled `preview`. All six current baselines are admitted by the complete
|
|
285
|
+
Linux, macOS, and Windows evidence from Agent Framework Adapter Matrix run 88.
|
|
286
|
+
Create and Attach require the reviewed v2 release inventory,
|
|
284
287
|
whose manifest, framework baseline, runtime, and platform claims were promoted
|
|
285
288
|
from the Linux, macOS, and Windows release matrix. Semantic implementation
|
|
286
289
|
digests remain audit provenance rather than runtime authorization. `plan`
|
|
@@ -290,12 +293,13 @@ selects `python`, `dotnet`, or `node`. `--framework` selects the independent
|
|
|
290
293
|
framework id when more than one admitted adapter shares that runtime.
|
|
291
294
|
`attach` shows that plan and requires an
|
|
292
295
|
interactive confirmation or explicit `--yes` before granting the filesystem
|
|
293
|
-
effect and writing an isolated `agents/<name>` directory.
|
|
294
|
-
agent.microsoft.python|dotnet` uses the
|
|
295
|
-
project: it registers the project, plans
|
|
296
|
-
nested runtime, then re-observes
|
|
297
|
-
|
|
298
|
-
lifecycle. Dependency installation,
|
|
296
|
+
effect and writing an isolated `agents/<name>` directory. When its selected
|
|
297
|
+
baseline is admitted, `create project agent.microsoft.python|dotnet` uses the
|
|
298
|
+
same governed lifecycle for a new project: it registers the project, plans
|
|
299
|
+
against a Model baseline, writes the nested runtime, then re-observes
|
|
300
|
+
Model/Graph before it claims Intelligence is sealed. The OpenAI and Google ADK
|
|
301
|
+
Create kits use the same admission-governed lifecycle. Dependency installation,
|
|
302
|
+
credentials, generated-code execution, and
|
|
299
303
|
model provider calls are never implied by that approval. `apply` is the
|
|
300
304
|
automation counterpart for a plan that was separately authorized with
|
|
301
305
|
`change authorize`. Any adapter, version, manifest, runtime, or platform drift
|
|
@@ -45,7 +45,7 @@ by Workspai and then registered in Workspace Intelligence:
|
|
|
45
45
|
- Astro: `npm create astro@latest <name>`
|
|
46
46
|
- SvelteKit: `npx sv@latest create <name>`
|
|
47
47
|
- Tauri: `npm create tauri-app@latest <name> -- --template vanilla-ts`
|
|
48
|
-
- Electron Forge: `npx create-electron-app@latest <name> --template
|
|
48
|
+
- Electron Forge: `npx create-electron-app@latest <name> --template vite --typescript`
|
|
49
49
|
- VS Code Extension: `npx --package yo@latest --package generator-code@latest -- yo code <name> ...`
|
|
50
50
|
- Laravel: `composer create-project --no-interaction --prefer-dist --stability=stable laravel/laravel <name>`
|
|
51
51
|
|
|
@@ -391,20 +391,24 @@ project metadata and performs the selected workspace registration.
|
|
|
391
391
|
|
|
392
392
|
## Agent Framework kits
|
|
393
393
|
|
|
394
|
-
| Kit
|
|
395
|
-
|
|
|
396
|
-
| `agent.microsoft.python`
|
|
397
|
-
| `agent.microsoft.dotnet`
|
|
398
|
-
| `agent.openai.python`
|
|
399
|
-
| `agent.openai.typescript`
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
394
|
+
| Kit | Runtime | Tested baseline | Layout |
|
|
395
|
+
| ----------------------------- | ------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
396
|
+
| `agent.microsoft.python` | Python | `agent-framework-core` `1.19.0`, Foundry `1.13.1`, `azure-identity` `1.25.3` | Isolated `agents/<instance>/` with `pyproject.toml`, credentialless `unittest`, and `.env.example`. Preview and release-admitted. |
|
|
397
|
+
| `agent.microsoft.dotnet` | .NET | `Microsoft.Agents.AI` `1.22.0`, Foundry `1.22.0-preview.260918.1` | Isolated `agents/<instance>/` with the executable project plus a dedicated test project. Preview and release-admitted. |
|
|
398
|
+
| `agent.openai.python` | Python | `openai-agents` `0.22.3` | Isolated `agents/<instance>/` with pip-editable `pyproject.toml`, credentialless `unittest`, and `.env.example`. Stable and release-admitted. |
|
|
399
|
+
| `agent.openai.typescript` | Node.js | `@openai/agents` `0.18.0`, `zod` `4.6.5` | Isolated `agents/<instance>/` with `package.json`, credentialless `node:test`, and `.env.example` |
|
|
400
|
+
| `agent.google-adk.python` | Python | `google-adk` `2.10.0` | Isolated `agents/<instance>/` with pip-editable `pyproject.toml`, credentialless `unittest`, and provider profiles `gemini-api` / `vertex-ai`. Preview and release-admitted. |
|
|
401
|
+
| `agent.google-adk.typescript` | Node.js | `@google/adk` `2.1.0`, `zod` `4.6.5` | Isolated `agents/<instance>/` with `package.json`, credentialless `node:test`, and provider profiles `gemini-api` / `vertex-ai`. Preview, release-admitted, and independent from the Python runtime. |
|
|
402
|
+
|
|
403
|
+
Interactive `workspai create` shows every published kit under **AI Agent** and
|
|
404
|
+
labels kits whose current baseline awaits release admission. Visibility is not
|
|
405
|
+
authorization: scaffolding remains blocked until the exact baseline has
|
|
406
|
+
reviewed evidence. Agent kits require Workspace governance and therefore do
|
|
407
|
+
not accept `--no-workspace`. Optional `--agent-name` names the instance
|
|
408
|
+
directory (default `primary`). They do not install dependencies, call a model,
|
|
409
|
+
or store credentials. Exact versions are promoted only after the full Linux,
|
|
410
|
+
macOS, and Windows conformance matrix passes. Weekly registry discovery is
|
|
411
|
+
report-only; it cannot rewrite these pins.
|
|
408
412
|
|
|
409
413
|
Create does not emit an empty root `pyproject.toml` or `.csproj`. The nested
|
|
410
414
|
instance is the only Workspace Run unit. After Create, Model and Graph already
|
|
@@ -421,17 +425,17 @@ independent proof for this scaffold. See
|
|
|
421
425
|
|
|
422
426
|
## AI Gateway kits
|
|
423
427
|
|
|
424
|
-
| Kit
|
|
425
|
-
|
|
|
426
|
-
| `gateway.openrouter.typescript` | Node.js | `@openrouter/sdk` `1.3.
|
|
427
|
-
| `gateway.openrouter.python`
|
|
428
|
+
| Kit | Runtime | Tested baseline | Layout |
|
|
429
|
+
| ------------------------------- | ------- | ----------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
|
|
430
|
+
| `gateway.openrouter.typescript` | Node.js | `@openrouter/sdk` `1.3.33`, TypeScript `5.9.3`, `@types/node` `22.20.3` | Server-owned OpenRouter Client SDK starter with `gateway.policy.json`, credentialless `node:test`, and `.env.example` |
|
|
431
|
+
| `gateway.openrouter.python` | Python | `openrouter` `1.2.32` | Server-owned OpenRouter Client SDK starter with `gateway.policy.json`, credentialless `unittest`, and `.env.example` |
|
|
428
432
|
|
|
429
433
|
Interactive `workspai create` shows these kits under **AI Gateway** with the
|
|
430
434
|
hint **Unified model access and routing**. A model identifier is runtime
|
|
431
435
|
configuration, not a kit. Create does not install dependencies, call a model,
|
|
432
436
|
or store credentials. Attach is not supported for Gateway in this release.
|
|
433
|
-
The official Go Client SDK remains beta (`v0.8.
|
|
434
|
-
2026-09-
|
|
437
|
+
The official Go Client SDK remains beta (`v0.8.32` on
|
|
438
|
+
2026-09-28) and is not admitted. See
|
|
435
439
|
[AI Gateway](./model-gateways.md).
|
|
436
440
|
|
|
437
441
|
## Desktop, extension, and additional backend generators
|
package/docs/doctor-command.md
CHANGED
|
@@ -775,9 +775,11 @@ These fields are designed for release gates and extension timeline cards that mu
|
|
|
775
775
|
- Supports Workspai, legacy RapidKit, and non-Workspai projects when project metadata is missing.
|
|
776
776
|
- Evidence: `.workspai/reports/doctor-project-last-run.json`.
|
|
777
777
|
- `--fix`, `--plan`, and `--apply` apply only project-scoped fixes.
|
|
778
|
-
- Governed Microsoft Agent Framework
|
|
779
|
-
`kind` as `agent`. Microsoft retains
|
|
780
|
-
retains `openai-agents
|
|
778
|
+
- Governed Microsoft Agent Framework, OpenAI Agents SDK, and Google ADK
|
|
779
|
+
projects keep `kind` as `agent`. Microsoft retains
|
|
780
|
+
`microsoft-agent-framework`; OpenAI retains `openai-agents`; Google ADK
|
|
781
|
+
retains `google-adk`. Doctor discovers nested environment examples and
|
|
782
|
+
dependency manifests under `agents/primary` and aims Python/`uv`, Node
|
|
781
783
|
dependency manifests under `agents/primary` and aims Python/`uv`, Node
|
|
782
784
|
`npm --prefix`, or .NET repair commands at that runtime, not at a phantom
|
|
783
785
|
project-root manifest.
|
package/docs/model-gateways.md
CHANGED
|
@@ -23,10 +23,10 @@ These kits ship as source-ready. That is not Workspai release admission and
|
|
|
23
23
|
does not label them `stable` or `qualified`. SDK `1.x` stability is an upstream
|
|
24
24
|
classification, not a Workspai release gate.
|
|
25
25
|
|
|
26
|
-
| Kit
|
|
27
|
-
|
|
|
28
|
-
| `gateway.openrouter.typescript` | Node.js `>=20`
|
|
29
|
-
| `gateway.openrouter.python`
|
|
26
|
+
| Kit | Runtime | Official Client SDK | Reviewed |
|
|
27
|
+
| ------------------------------- | --------------- | -------------------------- | ---------- |
|
|
28
|
+
| `gateway.openrouter.typescript` | Node.js `>=20` | `@openrouter/sdk` `1.3.33` | 2026-09-28 |
|
|
29
|
+
| `gateway.openrouter.python` | Python `>=3.10` | `openrouter` `1.2.32` | 2026-09-28 |
|
|
30
30
|
|
|
31
31
|
Aliases: `openrouter.typescript`, `gateway.openrouter.ts`, `openrouter-typescript`,
|
|
32
32
|
and the matching Python aliases. Bare `openrouter` is not an alias.
|
|
@@ -78,9 +78,9 @@ same commit before a Workspai release can present these kits as qualified.
|
|
|
78
78
|
## Intentionally unsupported languages
|
|
79
79
|
|
|
80
80
|
The official Go SDK (`github.com/OpenRouterTeam/go-sdk`) was evaluated on
|
|
81
|
-
2026-09-
|
|
81
|
+
2026-09-28. The upstream README classifies the current `0.x` line as beta and
|
|
82
82
|
warns that breaking changes may ship in minor releases. proxy.golang.org
|
|
83
|
-
reported `v0.8.
|
|
83
|
+
reported `v0.8.32`. Go is excluded from the stable Create surface until
|
|
84
84
|
upstream classifies a release line as stable.
|
|
85
85
|
|
|
86
86
|
The OpenRouter Agent SDK (`@openrouter/agent`) belongs to the agent-runtime
|
|
@@ -106,22 +106,22 @@ Routing and privacy policy live in source-controlled `gateway.policy.json`.
|
|
|
106
106
|
Field names match the pinned SDK for that language. Unknown fields are rejected
|
|
107
107
|
fail-closed in both languages. Supported controls:
|
|
108
108
|
|
|
109
|
-
| Official field
|
|
110
|
-
|
|
|
111
|
-
| model fallbacks
|
|
112
|
-
| `allowFallbacks`
|
|
113
|
-
| `order` / `only` / `ignore` | same camelCase
|
|
114
|
-
| `sort`
|
|
115
|
-
| `quantizations`
|
|
116
|
-
| `requireParameters`
|
|
117
|
-
| `zdr`
|
|
118
|
-
| `dataCollection`
|
|
119
|
-
| `enforceDistillableText`
|
|
120
|
-
| `maxPrice`
|
|
121
|
-
| `preferredMinThroughput`
|
|
122
|
-
| `preferredMaxLatency`
|
|
123
|
-
| timeout
|
|
124
|
-
| attribution
|
|
109
|
+
| Official field | TypeScript policy | Python policy | Validation |
|
|
110
|
+
| --------------------------- | ---------------------------------- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
111
|
+
| model fallbacks | `models` | `models` | unique non-empty strings; must not repeat `OPENROUTER_MODEL` |
|
|
112
|
+
| `allowFallbacks` | `allowFallbacks` | `allow_fallbacks` | boolean when present |
|
|
113
|
+
| `order` / `only` / `ignore` | same camelCase | same snake_case | unique non-empty strings; `only`∩`ignore` empty; `order` must not include ignored providers |
|
|
114
|
+
| `sort` | string or `{ by, partition }` | string or `{ by, partition }` | `price`/`throughput`/`latency`/`exacto`; `partition` is `model` or `none` |
|
|
115
|
+
| `quantizations` | camelCase list | snake_case list | pinned SDK enum values |
|
|
116
|
+
| `requireParameters` | `requireParameters` | `require_parameters` | boolean when present |
|
|
117
|
+
| `zdr` | `zdr` | `zdr` | boolean; cannot combine with `dataCollection`/`data_collection` `allow` |
|
|
118
|
+
| `dataCollection` | `dataCollection` | `data_collection` | `allow` or `deny` |
|
|
119
|
+
| `enforceDistillableText` | `enforceDistillableText` | `enforce_distillable_text` | boolean when present; both pinned SDKs expose this field |
|
|
120
|
+
| `maxPrice` | `maxPrice` | `max_price` | object with `prompt`/`completion`/`request`/`image`/`audio` as non-negative numeric strings that remain finite after numeric interpretation |
|
|
121
|
+
| `preferredMinThroughput` | number or `{ p50, p75, p90, p99 }` | same | finite non-negative numbers |
|
|
122
|
+
| `preferredMaxLatency` | number or `{ p50, p75, p90, p99 }` | same | finite non-negative numbers |
|
|
123
|
+
| timeout | `timeoutMs` | `timeout_ms` | integer 1–600000; env overrides with a digit string |
|
|
124
|
+
| attribution | `httpReferer`, `appTitle` | `http_referer`, `x_open_router_title` | strings when present |
|
|
125
125
|
|
|
126
126
|
`exacto` is part of the pinned SDK `ProviderSort` enums, not a Workspai extension.
|
|
127
127
|
Malformed JSON and wrong types raise `GatewayConfigurationError` before SDK
|
|
@@ -175,7 +175,7 @@ SDK `cancel()`. A cleanup failure does not replace the primary error or convert
|
|
|
175
175
|
a successful completion into an error.
|
|
176
176
|
|
|
177
177
|
The TypeScript starter forwards `AbortSignal` through `chat.send` options,
|
|
178
|
-
including an already-aborted signal. Pinned `@openrouter/sdk` `1.3.
|
|
178
|
+
including an already-aborted signal. Pinned `@openrouter/sdk` `1.3.33`
|
|
179
179
|
`EventStream` extends `ReadableStream` and does not expose a dedicated `close()`.
|
|
180
180
|
Cancellation is `ReadableStream` async-iterator `return()` → `cancel()`. If the
|
|
181
181
|
stream has already errored, `cancel()` may be a no-op; the gateway still drops
|
|
@@ -12,8 +12,8 @@ native kits:
|
|
|
12
12
|
This policy does not cover FastAPI or NestJS kits owned by the RapidKit Python
|
|
13
13
|
engine. It also does not cover generators delegated to an upstream official
|
|
14
14
|
CLI, such as Next.js, Astro, Angular, Vue, Svelte, Nuxt, or React Native.
|
|
15
|
-
Governed Microsoft Agent Framework
|
|
16
|
-
separately through the
|
|
15
|
+
Governed Microsoft Agent Framework, OpenAI Agents SDK, and Google ADK kits are
|
|
16
|
+
versioned separately through the
|
|
17
17
|
[Agent Framework Adapter Contract](./agent-framework-adapters.md); they are
|
|
18
18
|
not native HTTP service generators. OpenRouter AI Gateway kits are versioned
|
|
19
19
|
through [AI Gateway](./model-gateways.md) and are not Agent Framework kits.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "workspai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.79.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Open-source workspace intelligence CLI for software systems: create, adopt, govern, verify, and align polyglot workspaces for humans, CI, IDEs, and AI agents.",
|
|
6
6
|
"keywords": [
|
|
@@ -97,6 +97,7 @@
|
|
|
97
97
|
"test:parity-contract": "corepack npm run check:shared-contracts && vitest run src/__tests__/contracts/import-stack-parity.snapshot.test.ts",
|
|
98
98
|
"test:watch": "vitest",
|
|
99
99
|
"test:coverage": "corepack npm run test:prebuild && vitest run --coverage --reporter=default --reporter=json --outputFile.json=test-results/vitest.json",
|
|
100
|
+
"test:coverage:ci": "vitest run --coverage --reporter=default --reporter=json --outputFile.json=test-results/vitest.json",
|
|
100
101
|
"test:prepare-embeddings": "node scripts/prepare-mock-embeddings.mjs",
|
|
101
102
|
"generate-embeddings": "npx tsx src/ai/generate-embeddings.ts",
|
|
102
103
|
"verify:package-cli": "node scripts/verify-package-cli.mjs",
|
|
@@ -117,6 +118,8 @@
|
|
|
117
118
|
"test:agent-framework:dotnet": "tsx scripts/smoke-microsoft-agent-framework-adapter.ts --runtime dotnet",
|
|
118
119
|
"test:agent-framework:openai:python": "tsx scripts/smoke-openai-agents-adapter.ts --runtime python",
|
|
119
120
|
"test:agent-framework:openai:typescript": "tsx scripts/smoke-openai-agents-adapter.ts --runtime typescript",
|
|
121
|
+
"test:agent-framework:google-adk:python": "tsx scripts/smoke-google-adk-adapter.ts --runtime python",
|
|
122
|
+
"test:agent-framework:google-adk:typescript": "tsx scripts/smoke-google-adk-adapter.ts --runtime typescript",
|
|
120
123
|
"verify:agent-framework:matrix": "tsx scripts/verify-agent-framework-conformance.ts --reports test-results/agent-framework-conformance",
|
|
121
124
|
"discover:agent-framework:versions": "tsx scripts/discover-agent-framework-versions.ts",
|
|
122
125
|
"propose:agent-framework:versions": "tsx scripts/propose-agent-framework-version-update.ts",
|
|
@@ -358,6 +358,8 @@ function assertCliContracts() {
|
|
|
358
358
|
.map((adapter) => adapter.id)
|
|
359
359
|
.sort();
|
|
360
360
|
const expectedAdapterIds = [
|
|
361
|
+
'google-adk-python',
|
|
362
|
+
'google-adk-typescript',
|
|
361
363
|
'microsoft-agent-framework-dotnet',
|
|
362
364
|
'microsoft-agent-framework-python',
|
|
363
365
|
'openai-agents-python',
|
|
@@ -387,6 +389,19 @@ function assertCliContracts() {
|
|
|
387
389
|
);
|
|
388
390
|
}
|
|
389
391
|
}
|
|
392
|
+
for (const googleId of ['google-adk-python', 'google-adk-typescript']) {
|
|
393
|
+
const google = adapters.find((adapter) => adapter.id === googleId);
|
|
394
|
+
if (!google) {
|
|
395
|
+
fail(`published CLI is missing implemented Google ADK adapter ${googleId}`);
|
|
396
|
+
}
|
|
397
|
+
if (google.stability !== 'preview') {
|
|
398
|
+
fail(
|
|
399
|
+
`${googleId} must retain its preview stability label after release admission (observed: ${
|
|
400
|
+
google.stability ?? 'missing'
|
|
401
|
+
})`
|
|
402
|
+
);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
390
405
|
|
|
391
406
|
log(`verified CLI contract surfaces for v${version.version}`);
|
|
392
407
|
}
|
|
@@ -486,6 +501,41 @@ function smokeCreateAgentFrameworkKits() {
|
|
|
486
501
|
'agents/primary/README.md',
|
|
487
502
|
],
|
|
488
503
|
},
|
|
504
|
+
{
|
|
505
|
+
kit: 'agent.google-adk.python',
|
|
506
|
+
name: 'google-python-agent',
|
|
507
|
+
expectCreate: releaseAdmittedAdapterIds.has('google-adk-python'),
|
|
508
|
+
expectedFiles: [
|
|
509
|
+
'README.md',
|
|
510
|
+
'.workspai/project.json',
|
|
511
|
+
'.workspai/agent-frameworks/google-adk-python/primary.json',
|
|
512
|
+
'agents/primary/main.py',
|
|
513
|
+
'agents/primary/workspai_context.py',
|
|
514
|
+
'agents/primary/agent.py',
|
|
515
|
+
'agents/primary/pyproject.toml',
|
|
516
|
+
'agents/primary/tests/test_context.py',
|
|
517
|
+
'agents/primary/.env.example',
|
|
518
|
+
'agents/primary/README.md',
|
|
519
|
+
],
|
|
520
|
+
},
|
|
521
|
+
{
|
|
522
|
+
kit: 'agent.google-adk.typescript',
|
|
523
|
+
name: 'google-typescript-agent',
|
|
524
|
+
expectCreate: releaseAdmittedAdapterIds.has('google-adk-typescript'),
|
|
525
|
+
expectedFiles: [
|
|
526
|
+
'README.md',
|
|
527
|
+
'.workspai/project.json',
|
|
528
|
+
'.workspai/agent-frameworks/google-adk-typescript/primary.json',
|
|
529
|
+
'agents/primary/src/main.ts',
|
|
530
|
+
'agents/primary/src/workspai-context.ts',
|
|
531
|
+
'agents/primary/src/agent.ts',
|
|
532
|
+
'agents/primary/package.json',
|
|
533
|
+
'agents/primary/tsconfig.json',
|
|
534
|
+
'agents/primary/tests/context.test.ts',
|
|
535
|
+
'agents/primary/.env.example',
|
|
536
|
+
'agents/primary/README.md',
|
|
537
|
+
],
|
|
538
|
+
},
|
|
489
539
|
];
|
|
490
540
|
try {
|
|
491
541
|
for (const scenario of scenarios) {
|
package/dist/analyze-TJM66CPF.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{b as printAnalyzeReport,a as runAnalyze}from'./chunk-223SWPTL.js';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{b as AUTOPILOT_RELEASE_ALIAS_FILENAME,a as AUTOPILOT_RELEASE_LAST_RUN_FILENAME,c as runAutopilotRelease}from'./chunk-E7WJ2QX7.js';
|
package/dist/chunk-5KXOV7W4.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import {j,m,e}from'./chunk-LUPKDFQ3.js';import {u}from'./chunk-VQZ5PI5J.js';import {t}from'./chunk-ODK4LCEL.js';import d from'path';import f from'fs-extra';import {parse}from'yaml';import k from'fs';var L=new Set(["backend","desktop","extension","service","frontend","worker","agent","gateway","platform","library","infra","docs","test-suite","unknown"]),O=new Set([".git",".workspai","vendor","node_modules","test","tests","testdata","fixtures","samples","examples","third_party"]),F=new Set([...O,".cache",".venv","build","dist","target"]);async function I(e){let n=0,t=async(o,r)=>{if(r>5)return false;let s;try{s=await f.readdir(o,{withFileTypes:true});}catch{return false}for(let c of s.sort((u,a)=>u.name.localeCompare(a.name))){if(c.isFile()&&c.name==="main.go"){let u=await f.readFile(d.join(o,c.name),"utf8").catch(()=>"");if(/^\s*package\s+main\b/m.test(u)&&(n+=1,n>1))return true}if(c.isDirectory()&&!O.has(c.name)&&await t(d.join(o,c.name),r+1))return true}return false};return t(e,0)}async function M(e,n){if(n!=="c"&&n!=="cpp")return false;let t=new Set,o=async(r,s)=>{if(s>3||t.size>=3)return;let c;try{c=await f.readdir(r,{withFileTypes:true});}catch{return}for(let u of c)if(u.isFile()){let a=u.name.toLowerCase();a==="cmakelists.txt"||a==="meson.build"?t.add("native"):a==="pyproject.toml"||a==="setup.py"?t.add("python"):a==="description"&&d.basename(r).toLowerCase()==="r"?t.add("r"):a.endsWith(".gemspec")?t.add("ruby"):a==="pom.xml"||a==="build.gradle"||a==="build.gradle.kts"?t.add("java"):a==="cargo.toml"?t.add("rust"):a==="go.mod"?t.add("go"):a==="package.json"&&t.add("node");}else u.isDirectory()&&!F.has(u.name)&&await o(d.join(r,u.name),s+1);};return await o(e,0),t.has("native")&&t.size>=3}async function K(e){if((((await f.readFile(d.join(e,"pom.xml"),"utf8").catch(()=>"")).match(/<modules\b[^>]*>([\s\S]*?)<\/modules>/iu)?.[1]??"").match(/<module\b[^>]*>[^<]+<\/module>/giu)??[]).length>=2)return true;for(let o of ["settings.gradle","settings.gradle.kts"]){let r=await f.readFile(d.join(e,o),"utf8").catch(()=>"");if(!r)continue;if(new Set([...r.matchAll(/['"](:[^'"]+)['"]/gu)].map(c=>c[1])).size>=2)return true}return false}async function $(e){for(let n of ["compose.yaml","compose.yml","docker-compose.yaml","docker-compose.yml"]){let t=await f.readFile(d.join(e,n),"utf8").catch(()=>"");if(t)try{let r=parse(t)?.services??{},s=Object.entries(r).map(([i,p])=>{let g=(()=>{if(typeof p?.build=="string")return `${p.build}|Dockerfile`;if(!p?.build||typeof p.build!="object")return null;let l=p.build.context;if(typeof l!="string"||l.length===0)return null;let j="dockerfile"in p.build&&typeof p.build.dockerfile=="string"?p.build.dockerfile:"Dockerfile";return `${l}|${j}`})();return g?{serviceName:i,service:p,identity:g.replaceAll("\\","/").replace(/\/$/,"")}:null}).filter(i=>i!==null);if(new Set(s.map(i=>i.identity)).size<2)continue;let u=new Set(s.map(i=>i.serviceName)),a=new Set(s.filter(({service:i})=>Array.isArray(i.ports)&&i.ports.length>0).map(({identity:i})=>i)),y=s.some(({service:i})=>(Array.isArray(i.depends_on)?i.depends_on:i.depends_on&&typeof i.depends_on=="object"?Object.keys(i.depends_on):[]).some(g=>typeof g=="string"&&u.has(g)));if(a.size>=2||y)return true}catch{}}return false}async function A(e){try{if(!await f.pathExists(e))return null;let n=await f.readJSON(e);return n&&typeof n=="object"?n:null}catch{return null}}async function z(e){for(let n of e){let t=await A(n);if(t)return t}return null}function S(e){if(typeof e!="string")return null;let n=e.trim().toLowerCase();return L.has(n)?n==="service"?"backend":n:null}function re(e){switch(e){case "backend":case "service":case "worker":return "backend";case "agent":return "agent";case "gateway":return "gateway";case "frontend":case "desktop":case "extension":case "library":case "platform":return e;case "infra":return "infrastructure";case "docs":return "documentation";case "test-suite":return "quality";default:return "unknown"}}async function oe(e$1,n,t={}){let o=n??await z(u(e$1,"project.json")),r=j(o)?null:o,s=r===null&&o!==null?m(e$1,null):null,c=S(r?.kind)??S(r?.type);if(c)return c==="worker"&&typeof r?.framework=="string"&&(r.framework.trim().toLowerCase()==="microsoft-agent-framework"||r.framework.trim().toLowerCase()==="openai-agents")?"agent":c;let u$1=typeof r?.kit_name=="string"?r.kit_name:typeof r?.kit=="string"?r.kit:t.kit,a=typeof r?.framework=="string"?r.framework:t.framework??s?.key,y=typeof r?.runtime=="string"?r.runtime:t.runtime??s?.runtime,i=`${typeof u$1=="string"?u$1:""} ${a??""} ${y??""}`.trim().toLowerCase();if(await $(e$1))return "platform";if(/\b(tauri|electron|wails|desktop)\b/.test(i))return "desktop";if(/\b(vscode-extension|visual studio code extension|jetbrains-plugin|browser-extension)\b/.test(i))return "extension";if(typeof u$1=="string"&&u$1.trim().toLowerCase().startsWith("gateway.")||typeof a=="string"&&a.trim().toLowerCase()==="openrouter")return "gateway";let p=await f.readFile(d.join(e$1,"Cargo.toml"),"utf8").catch(()=>""),g=/^\s*\[workspace\]\s*$/m.test(p)&&!/^\s*\[package\]\s*$/m.test(p),l=await A(d.join(e$1,"package.json"));if(l!==null&&(Array.isArray(l.workspaces)||l.workspaces!==null&&typeof l.workspaces=="object")||g||e(e$1))return "platform";if(/\b(frontend|nextjs|next\.js|react|vue|svelte|vite|angular|astro|remix|nuxt)\b/.test(i))return "frontend";if(/\b(fastapi|nestjs|springboot|spring boot|gofiber|gogin|webapi|django|flask|express|fastify|laravel|rails|phoenix|axum|actix|rocket)\b/.test(i))return "backend";if(l){let m={...l.dependencies??{},...l.devDependencies??{}},D=l.scripts??{},b=Object.values(D).filter(w=>typeof w=="string").join(" ").toLowerCase(),_=l.engines??{},N=Array.isArray(l.categories)?l.categories.filter(w=>typeof w=="string"):[];if(m["@tauri-apps/api"]||m["@tauri-apps/cli"]||await f.pathExists(d.join(e$1,"src-tauri","tauri.conf.json"))||await f.pathExists(d.join(e$1,"src-tauri","tauri.conf.json5"))||m.electron||m["@electron-forge/cli"]||b.includes("electron-forge")||b.includes("electron "))return "desktop";if(typeof _.vscode=="string"||N.some(w=>w.toLowerCase()==="extension packs")||l.publisher&&(l.activationEvents||l.contributes))return "extension";if(m.next||m.react||m.vue||m.svelte||m.vite||m["@angular/core"]||b.includes("next ")||b.includes("vite "))return "frontend";if(l.private===true&&!m.express&&!m["@nestjs/core"])return "library"}return g||await K(e$1)||await f.pathExists(d.join(e$1,"go.work"))||await f.pathExists(d.join(e$1,"go.mod"))&&await I(e$1)?"platform":await M(e$1,y)?"library":await f.pathExists(d.join(e$1,"compose.yaml"))||await f.pathExists(d.join(e$1,"compose.yml"))||await f.pathExists(d.join(e$1,"docker-compose.yml"))||await f.pathExists(d.join(e$1,"docker-compose.yaml"))||await f.pathExists(d.join(e$1,"terraform.tf"))?"infra":"backend"}var B={ci:[".github/workflows",".gitlab-ci.yml",".circleci/config.yml","azure-pipelines.yml","bitbucket-pipelines.yml","cloudbuild.yaml","Jenkinsfile",".buildkite/pipeline.yml","prow"],release:[".changeset",".releaserc",".releaserc.json","release.config.js",".goreleaser.yml",".goreleaser.yaml","RELEASING.md","RELEASE.md","tools/release","scripts/release","docs/release","doc/release","build/release.sh","hack/lib/release.sh"],ownership:[".github/CODEOWNERS",".gitlab/CODEOWNERS","CODEOWNERS","docs/CODEOWNERS","OWNERS","OWNERS_ALIASES","MAINTAINERS"]},J=/(?:^|[-_.])(?:release|publish|publishing|distribution)(?:[-_.]|$)/i,V={ci:/\b(?:prow|buildkite|jenkins|teamcity|travis|external ci|test-infra)\b/i,release:/\b(?:release automation|release engineering|release infrastructure|external release)\b/i,ownership:/\b(?:external ownership|central owners|maintainer team|code owners)\b/i};async function U(e,n){let t=[];for(let o of n)try{await k.promises.access(d.join(e,o),k.constants.F_OK),t.push(o);}catch{}return t}async function Y(e,n){let t=["README.md","CONTRIBUTING.md","DEVELOPMENT.md","docs/devel/README.md"],o=[];for(let r of t)try{let s=d.join(e,r),c=await k.promises.stat(s);if(!c.isFile()||c.size>1024*1024)continue;let u=await k.promises.readFile(s,"utf8");n.test(u)&&o.push(r);}catch{}return o}async function q(e){let n=d.join(e,".github","workflows");try{return (await k.promises.readdir(n,{withFileTypes:true})).filter(o=>o.isFile()&&/\.(?:ya?ml)$/i.test(o.name)&&J.test(o.name)).map(o=>`.github/workflows/${o.name}`).sort()}catch{return []}}function H(e,n){let t$1=e?.[n];return t$1?.mode?{status:t$1.mode==="external"?"external-declared":"repository",provider:t$1.provider?.trim()||null,evidence:[t.workspaceContract],reference:t$1.reference?.trim()||null}:null}async function v(e,n,t){let o=H(n,t);if(o)return o;let r=[...await U(e,B[t]),...t==="release"?await q(e):[]];if(r.length>0)return {status:"repository",provider:null,evidence:r,reference:null};let s=await Y(e,V[t]);return s.length>0?{status:"external-observed",provider:null,evidence:s,reference:null}:{status:"unknown",provider:null,evidence:[],reference:null}}async function ue(e){let[n,t,o]=await Promise.all([v(e.projectPath,e.declaration,"ci"),v(e.projectPath,e.declaration,"release"),v(e.projectPath,e.declaration,"ownership")]);return {schemaVersion:"workspai.project-governance.v1",ci:n,release:t,ownership:o}}export{re as a,oe as b,ue as c};
|