workspai 0.75.2 → 0.76.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/agent-framework-capabilities.v1.json +2 -2
- package/contracts/cli-runtime-command-inventory.v1.snapshot.json +12 -0
- package/contracts/create-planner-capabilities.v1.json +24 -0
- package/contracts/extension-cli-compatibility.v1.json +4 -2
- package/contracts/published-contract-catalog.v1.json +10 -0
- package/contracts/runtime-command-surface.v1.json +3 -1
- package/contracts/workspace-intelligence/agent-framework-admission-candidate.v2.json +217 -0
- package/contracts/workspace-intelligence/agent-framework-conformance-report.v2.json +274 -0
- package/contracts/workspace-intelligence-architecture.v1.json +5 -3
- package/dist/analyze-QVRVJB7I.js +1 -0
- package/dist/autopilot-release-DOGIETAT.js +1 -0
- package/dist/capabilities-command-FYBUVHZ7.js +1 -0
- package/dist/{chunk-ADHX7D3F.js → chunk-23CNBYIW.js} +1 -1
- package/dist/{chunk-IKBE3HOH.js → chunk-2I2A55RE.js} +1 -1
- package/dist/{chunk-4JXJRIJM.js → chunk-4BBFEHPL.js} +1 -1
- package/dist/{chunk-VHMDWRDG.js → chunk-4BPZJR4Z.js} +4 -4
- package/dist/{chunk-KDVNRNDU.js → chunk-4MXKXHLW.js} +1 -1
- package/dist/{chunk-JKAAKE4Z.js → chunk-4R44E7HN.js} +1 -1
- package/dist/chunk-5S6IZ6PY.js +2 -0
- package/dist/chunk-6BO4QHKA.js +1 -0
- package/dist/{chunk-VWBWDDU2.js → chunk-AGI46TSQ.js} +1 -1
- package/dist/{chunk-GDOO2YZW.js → chunk-BZLDCASY.js} +1 -1
- package/dist/{chunk-OA2YJN22.js → chunk-DWDYLKVW.js} +1 -1
- package/dist/{chunk-P36TACKN.js → chunk-FBF767WP.js} +1 -1
- package/dist/{chunk-PFAGXI3G.js → chunk-FD2ZGGCQ.js} +1 -1
- package/dist/chunk-H4YHIOCT.js +7 -0
- package/dist/{chunk-ZI54C2AO.js → chunk-HRGIHWYH.js} +1 -1
- package/dist/{chunk-LFY7KTPD.js → chunk-IKNWNGLY.js} +1 -1
- package/dist/{chunk-ZGVODK5C.js → chunk-KO4DM2AV.js} +1 -1
- package/dist/{chunk-FNVWDXK2.js → chunk-KW35SWG6.js} +5 -5
- package/dist/{chunk-EP7SUMAX.js → chunk-L6VNI4DN.js} +1 -1
- package/dist/chunk-NSC4VWV2.js +1 -0
- package/dist/chunk-P5LI5DL3.js +1 -0
- package/dist/chunk-PSQPKK6H.js +97 -0
- package/dist/chunk-PUH3TSPC.js +1 -0
- package/dist/chunk-QFDTKOYS.js +2649 -0
- package/dist/chunk-QIPW3G2H.js +1 -0
- package/dist/chunk-QVFIR64T.js +10 -0
- package/dist/{chunk-FZWLWFR4.js → chunk-R3Z4LY3O.js} +1 -1
- package/dist/chunk-RKFTUIZ4.js +4 -0
- package/dist/{chunk-COOVCORC.js → chunk-SVO2GGTV.js} +1 -1
- package/dist/{chunk-5K4O3TAW.js → chunk-TFFNHWXY.js} +1 -1
- package/dist/chunk-TJ3MDZMC.js +6 -0
- package/dist/{chunk-WXUCAVFT.js → chunk-UOTOJJI4.js} +8 -8
- package/dist/chunk-VODNLROY.js +1 -0
- package/dist/{chunk-WHBKKJ7L.js → chunk-X7MDTBX5.js} +1 -1
- package/dist/chunk-YLLCZMKP.js +2 -0
- package/dist/{chunk-K52IQX3J.js → chunk-Z2M2XCIB.js} +1 -1
- package/dist/{chunk-DTNOF3MP.js → chunk-ZXQC36NJ.js} +1 -1
- package/dist/{create-ZFSFWAW3.js → create-ZRUQ3KNZ.js} +1 -1
- package/dist/{doctor-4KL4XUCS.js → doctor-7V7LJLHX.js} +1 -1
- package/dist/{goal-lifecycle-EXQZD7IA.js → goal-lifecycle-EM4DUJCR.js} +1 -1
- package/dist/{goal-pack-DKJU2DEP.js → goal-pack-YMWZHAH6.js} +1 -1
- package/dist/index.d.ts +12 -6
- package/dist/index.js +251 -250
- package/dist/{pipeline-4GVAOCEN.js → pipeline-6MBH3MU2.js} +1 -1
- package/dist/platform-capabilities-RWOWND5Q.js +1 -0
- package/dist/{project-agent-entry-7QKNEEXP.js → project-agent-entry-ZXAE2MAJ.js} +1 -1
- package/dist/{project-intelligence-lens-IHRYCLNU.js → project-intelligence-lens-NBTPOK2R.js} +1 -1
- package/dist/{project-test-coverage-3P5FH6E5.js → project-test-coverage-HOZC72EK.js} +1 -1
- package/dist/proof-carrying-change-WJFAKK3C.js +1 -0
- package/dist/{pythonRapidkitExec-UMFLDIYR.js → pythonRapidkitExec-S35OEIEF.js} +1 -1
- package/dist/{verified-goal-XI4RQESU.js → verified-goal-B7EX2PBE.js} +1 -1
- package/dist/{workspace-EYXAKMVI.js → workspace-EBPYCSEM.js} +1 -1
- package/dist/{workspace-agent-sync-SN55KT6N.js → workspace-agent-sync-Y4F6FBBC.js} +1 -1
- package/dist/{workspace-context-PW6ESEHH.js → workspace-context-Y7F7GJCQ.js} +1 -1
- package/dist/{workspace-contract-FPLFL4G3.js → workspace-contract-XJMWMVQE.js} +1 -1
- package/dist/{workspace-explain-TVQ5IF5D.js → workspace-explain-T2J5ZLY7.js} +1 -1
- package/dist/{workspace-foundation-DWIJPZRH.js → workspace-foundation-2UP6IMTH.js} +1 -1
- package/dist/{workspace-graph-stream-RUTNWLQB.js → workspace-graph-stream-MZVL3OCX.js} +1 -1
- package/dist/{workspace-intelligence-4CA2CSPZ.js → workspace-intelligence-FZRQIFFM.js} +1 -1
- package/dist/{workspace-intelligence-runner-VM5SXXAT.js → workspace-intelligence-runner-IXT62JG7.js} +1 -1
- package/dist/{workspace-knowledge-graph-JXN2ZOAF.js → workspace-knowledge-graph-EFC4TUDZ.js} +1 -1
- package/dist/workspace-knowledge-graph-snapshot-QIMF7TCF.js +1 -0
- package/dist/{workspace-mcp-serve-4WN4CSD7.js → workspace-mcp-serve-C42UUU7W.js} +1 -1
- package/dist/{workspace-model-D4IECQML.js → workspace-model-72SJ6WXT.js} +1 -1
- package/dist/{workspace-onboarding-6XWDKLM5.js → workspace-onboarding-TFDAIHTS.js} +1 -1
- package/dist/{workspace-registry-summary-Y3ET36NH.js → workspace-registry-summary-ZNTXSUI4.js} +1 -1
- package/dist/{workspace-repair-engine-HBUXRHDY.js → workspace-repair-engine-542TAL3Z.js} +1 -1
- package/dist/workspace-run-NAPJYNSZ.js +1 -0
- package/dist/{workspace-verify-OOAZ3NMZ.js → workspace-verify-UXKENOQU.js} +1 -1
- package/dist/{workspace-watch-BNM5B6HU.js → workspace-watch-DV5AHLOK.js} +1 -1
- package/docs/README.md +2 -2
- package/docs/agent-framework-adapters.md +164 -39
- package/docs/ci-workflows.md +29 -22
- package/docs/commands-reference.md +17 -8
- package/docs/creating-workspaces-and-projects.md +4 -2
- package/docs/doctor-command.md +6 -4
- package/docs/native-kit-baselines.md +2 -1
- package/docs/workspace-run.md +3 -1
- package/package.json +3 -1
- package/scripts/enterprise-package-smoke.mjs +98 -5
- package/dist/analyze-6UEBC5OJ.js +0 -1
- package/dist/autopilot-release-H5TO6NYY.js +0 -1
- package/dist/capabilities-command-VK3LQLP2.js +0 -1
- package/dist/chunk-3N27P3KO.js +0 -7
- package/dist/chunk-3RNWBFRP.js +0 -4
- package/dist/chunk-66O62XNJ.js +0 -97
- package/dist/chunk-7NKM6EHE.js +0 -7
- package/dist/chunk-BR6QIYQS.js +0 -1
- package/dist/chunk-DFREJHG7.js +0 -1
- package/dist/chunk-E42IFQFR.js +0 -6
- package/dist/chunk-EWD6QTAM.js +0 -2
- package/dist/chunk-G5UCEXP6.js +0 -1
- package/dist/chunk-LARREYZN.js +0 -1
- package/dist/chunk-RGNCL5OB.js +0 -1
- package/dist/chunk-SZHRPELL.js +0 -1
- package/dist/chunk-VXFIMEC6.js +0 -2
- package/dist/chunk-X7OI24LO.js +0 -418
- package/dist/platform-capabilities-DB4BZPTD.js +0 -1
- package/dist/proof-carrying-change-O37XUPIZ.js +0 -1
- package/dist/workspace-knowledge-graph-snapshot-KBNUXA64.js +0 -1
- package/dist/workspace-run-VN7KV4BU.js +0 -1
|
@@ -12,23 +12,31 @@ existing project ---/ |
|
|
|
12
12
|
-> Workspai Context, Goal, PCC, and Verify
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
Microsoft Agent Framework is the first
|
|
15
|
+
Microsoft Agent Framework is the first adapter implementation of this
|
|
16
16
|
foundation. Its Python and .NET adapters are intentionally separate because
|
|
17
17
|
their package graphs, runtime requirements, entrypoints, and verification
|
|
18
|
-
commands differ. Both
|
|
19
|
-
manifest
|
|
20
|
-
and are bound into the reviewed release-admission inventory.
|
|
18
|
+
commands differ. Both become available for governed attachment only after the
|
|
19
|
+
exact manifest and release baseline pass the required Linux, macOS, and Windows
|
|
20
|
+
conformance lanes and are bound into the reviewed release-admission inventory.
|
|
21
|
+
Per-platform semantic implementation digests accompany that evidence for
|
|
22
|
+
traceability, but do not act as runtime authorization locks.
|
|
23
|
+
|
|
24
|
+
OpenAI Agents SDK adapters for Python and TypeScript are implemented in the
|
|
25
|
+
same registry and lifecycle. They become Create/Attach kits only after their
|
|
26
|
+
complete cross-platform matrix is reviewed into that inventory. Public
|
|
27
|
+
commands fail closed rather than silently substituting Microsoft, OpenAI, or
|
|
28
|
+
another runtime.
|
|
21
29
|
|
|
22
30
|
## Published contracts
|
|
23
31
|
|
|
24
|
-
| Contract | Purpose
|
|
25
|
-
| ------------------------------------------------------------------------------ |
|
|
26
|
-
| `contracts/agent-framework-capabilities.v1.json` | Normative ownership, capability, lifecycle, security, versioning, and admission rules
|
|
27
|
-
| `contracts/workspace-intelligence/agent-framework-adapter-manifest.v1.json` | JSON Schema for one framework/version adapter declaration
|
|
28
|
-
| `contracts/workspace-intelligence/agent-framework-conformance-report.
|
|
29
|
-
| `contracts/workspace-intelligence/agent-framework-change-plan.v1.json` | Portable, mutation-free scaffold or attach plan returned to the host
|
|
30
|
-
| `contracts/workspace-intelligence/agent-framework-ownership-receipt.v1.json` | Hash-bound proof of the files Workspai may safely refresh
|
|
31
|
-
| `contracts/workspace-intelligence/agent-framework-admission-candidate.
|
|
32
|
+
| Contract | Purpose |
|
|
33
|
+
| ------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------- |
|
|
34
|
+
| `contracts/agent-framework-capabilities.v1.json` | Normative ownership, capability, lifecycle, security, versioning, and admission rules |
|
|
35
|
+
| `contracts/workspace-intelligence/agent-framework-adapter-manifest.v1.json` | JSON Schema for one framework/version adapter declaration |
|
|
36
|
+
| `contracts/workspace-intelligence/agent-framework-conformance-report.v2.json` | JSON Schema binding reproducible adapter evidence to manifest and implementation digests |
|
|
37
|
+
| `contracts/workspace-intelligence/agent-framework-change-plan.v1.json` | Portable, mutation-free scaffold or attach plan returned to the host |
|
|
38
|
+
| `contracts/workspace-intelligence/agent-framework-ownership-receipt.v1.json` | Hash-bound proof of the files Workspai may safely refresh |
|
|
39
|
+
| `contracts/workspace-intelligence/agent-framework-admission-candidate.v2.json` | Review-pending, digest-bound index of the complete cross-platform evidence matrix |
|
|
32
40
|
|
|
33
41
|
The schemas are also discoverable through
|
|
34
42
|
`contracts/published-contract-catalog.v1.json` and the extension compatibility
|
|
@@ -109,16 +117,38 @@ Generated starter files use an isolated `agents/<instance>` root and keep
|
|
|
109
117
|
adapter state under `.workspai/agent-frameworks/<adapter>/<instance>.json`.
|
|
110
118
|
That instance contains the only runtime dependency manifest; the project root
|
|
111
119
|
does not receive an empty Python or .NET manifest that could be mistaken for a
|
|
112
|
-
second executable unit.
|
|
120
|
+
second executable unit. Python and .NET starters resolve bounded context from
|
|
121
|
+
the directory that owns `agents/<instance>/`. They do not use process cwd.
|
|
122
|
+
`workspace run start` executes from the agent package directory and still
|
|
123
|
+
finds `.workspai/reports/project-context-agent.json` at the project root.
|
|
124
|
+
Loaders share the OpenAI containment contract: canonical path walk, regular-file
|
|
125
|
+
open, 128 KiB cap, UTF-8 JSON, and `schemaVersion: project-context-agent.v1`.
|
|
126
|
+
The Python starter is pip-editable (`[build-system]` + setuptools modules) and
|
|
127
|
+
uses the official Foundry hello-world `Agent(client=FoundryChatClient(...))`
|
|
128
|
+
pattern with three read-only documented tools: `describe_workspai_context`,
|
|
129
|
+
`read_workspai_project_summary`, and `list_workspai_supported_commands`. The
|
|
130
|
+
.NET starter uses `AIProjectClient.AsAIAgent` plus `AIFunctionFactory.Create`,
|
|
131
|
+
enables `RestorePackagesWithLockFile`, and does not emit invented NuGet lock
|
|
132
|
+
hashes. Neither starter pastes admitted JSON into instructions; live
|
|
133
|
+
entrypoints stream stdout and accept a prompt from argv or stdin. Neither
|
|
134
|
+
starter hardcodes a Foundry model name; `FOUNDRY_MODEL` is
|
|
135
|
+
required. `DefaultAzureCredential` remains the local development convenience
|
|
136
|
+
Microsoft documents; generated READMEs tell production hosts to prefer
|
|
137
|
+
`ManagedIdentityCredential`. Adapters remain `preview`. Unsupported Microsoft
|
|
138
|
+
primitives (durable workflows, MCP, HITL loops, hosted tools) stay out of the
|
|
139
|
+
generated first-version scaffold.
|
|
140
|
+
Workspace Model reports these projects as `agent`,
|
|
113
141
|
retains `microsoft-agent-framework` as their framework identity, and reports
|
|
114
142
|
only lifecycle stages backed by concrete manifests, entrypoints, tests, or an
|
|
115
143
|
owned project runner.
|
|
116
144
|
Each starter also includes credentialless tests for the bounded context
|
|
117
|
-
boundary and
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
145
|
+
boundary, allowlisted views, and Azure-shaped redaction, plus an
|
|
146
|
+
environment-name example with no secret values. Python context
|
|
147
|
+
tests isolate the operational context file and restore it afterward; they stay
|
|
148
|
+
dependency-free unless `agent-framework` is installed for the optional
|
|
149
|
+
LocalChatClient loop. .NET uses a separately pinned test project. The conformance
|
|
150
|
+
matrix executes these tests in addition to compiling and exercising the
|
|
151
|
+
deterministic framework lifecycle.
|
|
122
152
|
Existing user-authored files are blockers, never overwrite targets. A managed
|
|
123
153
|
comment alone does not prove ownership: refresh also requires the previous
|
|
124
154
|
Workspai ownership receipt, which is bound to the exact adapter-manifest digest;
|
|
@@ -127,18 +157,100 @@ Provider credentials remain environment references. The first provider profile u
|
|
|
127
157
|
Microsoft Foundry, but provider identity is not part of framework identity and
|
|
128
158
|
additional profiles must preserve the same security boundary.
|
|
129
159
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
160
|
+
## OpenAI Agents SDK baseline
|
|
161
|
+
|
|
162
|
+
The built-in OpenAI adapters pin independently verified SDK baselines. They do
|
|
163
|
+
not reuse Microsoft detection, kits, or model-provider defaults.
|
|
164
|
+
|
|
165
|
+
| Adapter | Tested framework | Runtime | Authored detection |
|
|
166
|
+
| -------------------------- | ---------------- | --------------- | ---------------------------------- |
|
|
167
|
+
| `openai-agents-python` | `0.22.2` | Python `>=3.10` | exact PyPI package `openai-agents` |
|
|
168
|
+
| `openai-agents-typescript` | `0.18.0` | Node.js `>=22` | exact npm package `@openai/agents` |
|
|
169
|
+
|
|
170
|
+
The TypeScript starter also pins peer `zod` `4.6.5`, TypeScript `5.9.3`, and
|
|
171
|
+
`@types/node` `22.20.3`. The `openai` PyPI or npm package alone is not this
|
|
172
|
+
framework. Generated markers under `.workspai/agent-frameworks/` cannot select
|
|
173
|
+
it.
|
|
174
|
+
|
|
175
|
+
Generated loaders resolve the Workspai project as the directory that owns
|
|
176
|
+
`agents/<instance>/`. They do not use process cwd, unbounded ancestor search,
|
|
177
|
+
or a copied context file inside the agent package. Canonical containment,
|
|
178
|
+
a regular-file open (`O_NOFOLLOW` when the platform provides it), the 128 KiB
|
|
179
|
+
cap, UTF-8 JSON, and `schemaVersion: project-context-agent.v1` are enforced in
|
|
180
|
+
the starter. Generation, freshness, and integrity remain host-owned agent-sync
|
|
181
|
+
work. Internal symlinks, including Windows reparse points treated as links, are
|
|
182
|
+
allowed only when every resolved hop stays inside the project root. Diagnostics
|
|
183
|
+
do not include file contents.
|
|
184
|
+
|
|
185
|
+
The loader walk is not an atomic open. Between `lstat` of one hop and `open` of
|
|
186
|
+
the next, a local actor who can replace a path component may still race the
|
|
187
|
+
walk. The bound we claim, and only that bound, is: after a successful open with
|
|
188
|
+
`O_NOFOLLOW` when the kernel provides it, that file descriptor is `fstat`'d and
|
|
189
|
+
at most 128 KiB is read from that descriptor. This is not a proof of complete
|
|
190
|
+
TOCTOU immunity, of Windows junction behavior on every host, or of
|
|
191
|
+
enterprise-grade isolation.
|
|
192
|
+
|
|
193
|
+
Claimed capabilities are conservative and independently evidenced:
|
|
194
|
+
|
|
195
|
+
- native: `single-agent`, `typed-tools`, `local-execution`
|
|
196
|
+
- conditional: `telemetry` (defaults off; `WORKSPAI_AGENT_TRACING=1` opts in;
|
|
197
|
+
`OPENAI_AGENTS_DISABLE_TRACING=1|true` keeps tracing off even if the opt-in
|
|
198
|
+
is set), `provider-neutral-models` (starter only reads `OPENAI_MODEL` /
|
|
199
|
+
`OPENAI_DEFAULT_MODEL`)
|
|
200
|
+
- unsupported in this version: handoffs, MCP, sessions/resume, voice, sandbox,
|
|
201
|
+
hosted tools, and human-approval loops
|
|
202
|
+
|
|
203
|
+
Python cancellation uses `Runner.max_turns` and `ModelSettings.timeout` from
|
|
204
|
+
`openai-agents` `0.22.2`. `ModelSettings.timeout` is a per-model-request
|
|
205
|
+
timeout applied only on the live model path. Injected `ScriptedModel` runs omit
|
|
206
|
+
it because that setting hung the official test double on Python 3.13.
|
|
207
|
+
TypeScript cancellation uses `maxTurns` plus `AbortSignal` from
|
|
208
|
+
`@openai/agents` `0.18.0`. Those SDK controls are not a Workspai-owned timeout
|
|
209
|
+
service. Workspai still owns mutation admission and verification; a successful
|
|
210
|
+
model run is not verified evidence.
|
|
211
|
+
|
|
212
|
+
Generated starters do not paste `project-context-agent.json` into model
|
|
213
|
+
instructions. They expose three read-only tools over allowlisted views:
|
|
214
|
+
context size and `schemaVersion`, workspace/project identity (including
|
|
215
|
+
`boundedGraphSearch` as a pointer, not a shell), and the admitted command
|
|
216
|
+
surface. Live Python uses `Runner.run_streamed`; live TypeScript streams
|
|
217
|
+
`Runner.run({ stream: true })`. Credentialless ScriptedModel tests stay on
|
|
218
|
+
the non-stream `run` path. A prompt is taken from argv or stdin.
|
|
219
|
+
|
|
220
|
+
Generated OpenAI context tests copy the operational
|
|
221
|
+
`.workspai/reports/project-context-agent.json` aside for the suite and restore
|
|
222
|
+
it afterward. A green test run is not allowed to delete or replace that host
|
|
223
|
+
artifact.
|
|
224
|
+
|
|
225
|
+
Create lists every published agent kit under **AI Agent**, including
|
|
226
|
+
`agent.openai.python` and `agent.openai.typescript`. That picker is the
|
|
227
|
+
published catalog: it is not filtered by release-admission digest match or
|
|
228
|
+
workspace profile. A later adapter-manifest change must not hide a kit.
|
|
229
|
+
Create and Attach still refuse a kit whose adapter is not release-admitted;
|
|
230
|
+
visibility in the picker is not permission to write a blocked adapter.
|
|
231
|
+
Attach still requires `--framework openai-agents` when the
|
|
232
|
+
runtime is shared. OpenAI adapters are labeled `stable`; release admission
|
|
233
|
+
remains blocked until the exact v2 cross-platform candidate is promoted.
|
|
234
|
+
Handoffs, MCP, sessions, voice, sandbox, and approval loops stay unsupported.
|
|
235
|
+
Microsoft adapters remain `preview`.
|
|
236
|
+
|
|
237
|
+
A path-filtered PR gate compiles only the affected Microsoft or OpenAI adapter
|
|
238
|
+
family on Linux. Shared lifecycle, security, registry, admission, and contract
|
|
239
|
+
changes select both families; documentation-only edits do not run adapter
|
|
240
|
+
conformance. The complete twelve-lane matrix is an explicit release-
|
|
241
|
+
qualification operation: it compiles Microsoft Python/.NET and OpenAI
|
|
242
|
+
Python/TypeScript on Linux, macOS, and Windows. Every full-qualification lane
|
|
243
|
+
records all 18 mandatory checks, the exact runtime and framework baseline,
|
|
244
|
+
digests of the adapter manifest and semantic implementation, and one bounded
|
|
245
|
+
evidence file per check. Reports are retained as CI artifacts for review. A
|
|
246
|
+
final job validates every evidence path and emits an admission candidate only
|
|
247
|
+
when all three operating-system lanes pass for every built-in adapter.
|
|
136
248
|
Python conformance is pinned to 3.10.11, the final Python 3.10 release with
|
|
137
249
|
cross-platform binary installers; this provides one reproducible minimum-runtime
|
|
138
250
|
baseline while the adapter continues to declare Python `>=3.10` support.
|
|
139
251
|
|
|
140
252
|
After verification, CI emits one admission-candidate artifact. It binds the
|
|
141
|
-
source commit, CLI version, adapter
|
|
253
|
+
source commit, CLI version, adapter manifest and implementation digests, lane reports, and every
|
|
142
254
|
evidence file by SHA-256. Its status is always `pending`: successful CI produces
|
|
143
255
|
reviewable evidence, not release authority. Only the protected version-update
|
|
144
256
|
branch may convert that candidate into the exact release-admission inventory,
|
|
@@ -149,11 +261,16 @@ blocked when callers provide neither raw conformance reports nor explicit
|
|
|
149
261
|
permission to use the bundled reviewed release inventory. User-facing commands
|
|
150
262
|
enable that inventory deliberately and fail closed if an adapter version,
|
|
151
263
|
manifest digest, framework baseline, runtime, or platform list has changed.
|
|
264
|
+
Semantic implementation digests remain in lane reports, candidates, and the
|
|
265
|
+
reviewed inventory as audit provenance. They are verified during full
|
|
266
|
+
qualification and promotion, but are deliberately not runtime authorization:
|
|
267
|
+
routine implementation changes are guarded by affected-family tests instead
|
|
268
|
+
of requiring a hand-edited admission digest for every source edit.
|
|
152
269
|
|
|
153
270
|
## Attach an agent runtime
|
|
154
271
|
|
|
155
|
-
Build current Workspace Intelligence first, then inspect
|
|
156
|
-
|
|
272
|
+
Build current Workspace Intelligence first, then inspect adapter admission
|
|
273
|
+
state:
|
|
157
274
|
|
|
158
275
|
```bash
|
|
159
276
|
npx workspai workspace intelligence run --for-agent generic --strict --json
|
|
@@ -170,6 +287,11 @@ npx workspai agent framework plan \
|
|
|
170
287
|
--name support-agent
|
|
171
288
|
```
|
|
172
289
|
|
|
290
|
+
When more than one admitted framework shares a runtime, pass `--framework`
|
|
291
|
+
explicitly. Workspai does not guess or fall back. `--runtime python` without
|
|
292
|
+
`--framework` now requires an explicit choice because Microsoft Agent Framework
|
|
293
|
+
and OpenAI Agents SDK are both admitted.
|
|
294
|
+
|
|
173
295
|
The interactive attach command displays the same plan and asks before granting
|
|
174
296
|
its filesystem effect. Automation must opt in with `--yes` and records the
|
|
175
297
|
identity supplied by `--granted-by`:
|
|
@@ -207,8 +329,9 @@ npx workspai create project agent.microsoft.dotnet operations-agent
|
|
|
207
329
|
Create writes a minimal runtime identity, registers the project, seals a
|
|
208
330
|
Model/Graph baseline so the adapter can plan, applies the adapter-owned scaffold
|
|
209
331
|
inside that Change, then re-observes Model, Graph, and project grounding against
|
|
210
|
-
the nested runtime. The interactive wizard
|
|
211
|
-
Agent** category
|
|
332
|
+
the nested runtime. The interactive wizard lists every published kit under the
|
|
333
|
+
**AI Agent** category. Scaffolding still requires the selected adapter to be
|
|
334
|
+
release-admitted. A failed scaffold
|
|
212
335
|
rolls back the new directory and workspace registration. Detection itself
|
|
213
336
|
remains read-only and never authorizes writes.
|
|
214
337
|
|
|
@@ -274,10 +397,12 @@ and unadvertised runtimes fail closed.
|
|
|
274
397
|
|
|
275
398
|
The generic boundary was hardened against two deliberately different
|
|
276
399
|
integration shapes: a filesystem-first Node.js framework and the
|
|
277
|
-
multi-language Microsoft Agent Framework.
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
400
|
+
multi-language Microsoft Agent Framework. OpenAI Agents SDK Python and
|
|
401
|
+
TypeScript adapters now share that same create, attach, detection, ownership,
|
|
402
|
+
and verification host. They are selectable for Create and Attach only after
|
|
403
|
+
their exact manifest digest, framework baseline, runtime, and platform list
|
|
404
|
+
enter the reviewed release-admission inventory. Microsoft adapters remain
|
|
405
|
+
selectable while their current inventory entries stay valid.
|
|
281
406
|
|
|
282
407
|
## Implementation sequence
|
|
283
408
|
|
|
@@ -286,13 +411,13 @@ reviewed release-admission inventory.
|
|
|
286
411
|
2. Use the framework-neutral registry, detector, and bounded manifest loader.
|
|
287
412
|
3. Review the Microsoft Python and .NET digest-bound evidence produced by the
|
|
288
413
|
full conformance matrix.
|
|
289
|
-
4.
|
|
414
|
+
4. Review the OpenAI Python and TypeScript digest-bound evidence produced by
|
|
415
|
+
the same matrix; do not treat local Linux success as multi-OS admission.
|
|
416
|
+
5. Keep automated upstream discovery separate from release authority: report
|
|
290
417
|
newer registry versions, then update pins only through a reviewed change.
|
|
291
418
|
Re-run the full matrix before treating a new pin as independently proven.
|
|
292
|
-
5. Admit another framework only after its create and attach paths share these
|
|
293
|
-
ownership, rollback, and verification guarantees.
|
|
294
419
|
|
|
295
420
|
AutoGen is not planned as a new-project target because Microsoft Agent
|
|
296
|
-
Framework is its supported successor path. Eve
|
|
297
|
-
|
|
298
|
-
|
|
421
|
+
Framework is its supported successor path. Eve and LangGraph are not
|
|
422
|
+
advertised; each requires its own adapter, tested baseline, and conformance
|
|
423
|
+
evidence.
|
package/docs/ci-workflows.md
CHANGED
|
@@ -4,31 +4,38 @@ Map of GitHub Actions workflows in this repository. Use this when editing CI to
|
|
|
4
4
|
|
|
5
5
|
## Workflows
|
|
6
6
|
|
|
7
|
-
| Workflow
|
|
8
|
-
|
|
|
9
|
-
| Build / test matrix
|
|
10
|
-
| Workspace E2E matrix
|
|
11
|
-
| Windows bridge E2E
|
|
12
|
-
| E2E smoke
|
|
13
|
-
| Official generator smoke
|
|
14
|
-
| Agent Framework matrix
|
|
15
|
-
| Agent Framework discovery| `.github/workflows/agent-framework-version-discovery.yml` | Weekly PyPI/NuGet candidate report; no commit, PR, or contract rewrite
|
|
16
|
-
| Security
|
|
17
|
-
| Manual npm release
|
|
18
|
-
| Discord announcement
|
|
19
|
-
| Contributor onboarding
|
|
20
|
-
| Contributor Hub
|
|
21
|
-
| Welcome
|
|
7
|
+
| Workflow | Path | Purpose |
|
|
8
|
+
| ------------------------- | --------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
|
|
9
|
+
| Build / test matrix | `.github/workflows/ci.yml` | Path-aware docs or full matrix validation plus the required `CI Gate` |
|
|
10
|
+
| Workspace E2E matrix | `.github/workflows/workspace-e2e-matrix.yml` | Cross-OS workspace lifecycle smoke; setup `--warm-deps`; cache/mirror ops |
|
|
11
|
+
| Windows bridge E2E | `.github/workflows/windows-bridge-e2e.yml` | Native Windows bridge and lifecycle checks |
|
|
12
|
+
| E2E smoke | `.github/workflows/e2e-smoke.yml` | Focused bridge regression smoke |
|
|
13
|
+
| Official generator smoke | `.github/workflows/frontend-generator-smoke.yml` | Contract-driven official-generator drift gate |
|
|
14
|
+
| Agent Framework matrix | `.github/workflows/agent-framework-conformance.yml` | Affected-family Linux PR gate plus manual twelve-lane release qualification and admission |
|
|
15
|
+
| Agent Framework discovery | `.github/workflows/agent-framework-version-discovery.yml` | Weekly PyPI/NuGet candidate report; no commit, PR, or contract rewrite |
|
|
16
|
+
| Security | `.github/workflows/security.yml` | Path-aware scanning plus the always-resolved `Security Gate` |
|
|
17
|
+
| Manual npm release | `.github/workflows/release-npm-manual.yml` | Maintainer-only release gate and publish workflow |
|
|
18
|
+
| Discord announcement | `.github/workflows/discord-release-announcement.yml` | Preview and publish one idempotent product-aware release announcement |
|
|
19
|
+
| Contributor onboarding | `.github/workflows/contributor-onboarding.yml` | Accepted-contributor onboarding automation |
|
|
20
|
+
| Contributor Hub | `.github/workflows/contributor-hub.yml` | Daily live issue-route freshness |
|
|
21
|
+
| Welcome | `.github/workflows/welcome.yml` | First-issue and first-contribution messages |
|
|
22
22
|
|
|
23
23
|
## Agent Framework workflows
|
|
24
24
|
|
|
25
|
-
Weekly `agent-framework-version-discovery` checks PyPI and
|
|
25
|
+
Weekly `agent-framework-version-discovery` checks PyPI, NuGet, and npm, then stops at
|
|
26
26
|
a report and artifact. It does not commit, open a pull request, regenerate
|
|
27
|
-
Create contracts, or write `release-admissions.
|
|
28
|
-
still has to pass `agent-framework-conformance` on
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
Create contracts, or write `release-admissions.v2.json`. A human pin update
|
|
28
|
+
still has to pass the manual `full` mode of `agent-framework-conformance` on
|
|
29
|
+
Linux, macOS, and Windows for every built-in adapter runtime. Pull requests run
|
|
30
|
+
the faster Linux gate only for the affected Microsoft or OpenAI family; shared
|
|
31
|
+
agent-framework surfaces select both, while documentation-only changes skip the
|
|
32
|
+
specialized workflow. The full matrix compiles the nested `agents/primary`
|
|
33
|
+
runtime, runs credentialless context-boundary tests, and records manifest-bound
|
|
34
|
+
admission data plus semantic implementation provenance. Promotion requires the
|
|
35
|
+
candidate source commit to equal the checked-out promotion commit. An
|
|
36
|
+
implementation digest is audit evidence, not a runtime lock and not a manual
|
|
37
|
+
maintenance requirement after every routine adapter edit.
|
|
38
|
+
It never sets Foundry or OpenAI credentials. Only a reviewed admission on the protected
|
|
32
39
|
version-update branch can promote a green candidate.
|
|
33
40
|
|
|
34
41
|
The PR template at `.github/agent-framework-version-update.md` is for that
|
|
@@ -118,7 +125,7 @@ Validate or preview the current CLI announcement locally:
|
|
|
118
125
|
npm --workspace workspai run check:release-announcement
|
|
119
126
|
npm --workspace workspai run release:announcement -- \
|
|
120
127
|
--product workspai-cli \
|
|
121
|
-
--tag v0.
|
|
128
|
+
--tag v0.76.0 \
|
|
122
129
|
--markdown-output /tmp/workspai-discord-announcement.md
|
|
123
130
|
```
|
|
124
131
|
|
|
@@ -84,9 +84,9 @@ npx workspai create project agent.microsoft.python <name> [--agent-name <name>]
|
|
|
84
84
|
npx workspai create project agent.microsoft.dotnet <name> [--agent-name <name>] [--skip-git]
|
|
85
85
|
npx workspai agent bootstrap [--project <path>] [--for-agent <host>] [--no-live-inputs] [--strict] [--json]
|
|
86
86
|
npx workspai agent framework list [--json]
|
|
87
|
-
npx workspai agent framework plan --project <name> --runtime <python|dotnet> --name <agent> [--goal <goal-id>] [--workspace <path>] [--json]
|
|
88
|
-
npx workspai agent framework attach --project <name> --runtime <python|dotnet> --name <agent> [-y] [--granted-by <identity>] [--workspace <path>] [--json]
|
|
89
|
-
npx workspai agent framework apply --change <change-id> --project <name> --runtime <python|dotnet> [--workspace <path>] [--json]
|
|
87
|
+
npx workspai agent framework plan --project <name> --runtime <python|dotnet|node> [--framework <id>] --name <agent> [--goal <goal-id>] [--workspace <path>] [--json]
|
|
88
|
+
npx workspai agent framework attach --project <name> --runtime <python|dotnet|node> [--framework <id>] --name <agent> [-y] [--granted-by <identity>] [--workspace <path>] [--json]
|
|
89
|
+
npx workspai agent framework apply --change <change-id> --project <name> --runtime <python|dotnet|node> [--framework <id>] [--workspace <path>] [--json]
|
|
90
90
|
```
|
|
91
91
|
|
|
92
92
|
Recommended CI:
|
|
@@ -275,16 +275,25 @@ Blocked receipts exit `2`; strict mode also maps degraded evidence to exit `2`.
|
|
|
275
275
|
See [Canonical-first agent entry](./agent-entry.md).
|
|
276
276
|
|
|
277
277
|
`agent framework` is the governed bridge between Workspai evidence and an
|
|
278
|
-
agent runtime. `list` exposes
|
|
279
|
-
`1.18.0` and .NET `1.21.0`
|
|
280
|
-
|
|
281
|
-
|
|
278
|
+
agent runtime. `list` exposes every built-in adapter and its release-admission
|
|
279
|
+
state. In this CLI version Microsoft Python `1.18.0` and .NET `1.21.0` remain
|
|
280
|
+
`preview`. OpenAI Agents SDK Python `0.22.2` and TypeScript `0.18.0` are
|
|
281
|
+
labeled `stable`. Create and Attach require the reviewed v2 release inventory,
|
|
282
|
+
whose manifest, framework baseline, runtime, and platform claims were promoted
|
|
283
|
+
from the Linux, macOS, and Windows release matrix. Semantic implementation
|
|
284
|
+
digests remain audit provenance rather than runtime authorization. `plan`
|
|
285
|
+
creates or reuses a scoped Goal, begins a Proof-Carrying Change, and
|
|
286
|
+
attaches a hash-bound file plan without writing project files. `--runtime`
|
|
287
|
+
selects `python`, `dotnet`, or `node`. `--framework` selects the independent
|
|
288
|
+
framework id when more than one admitted adapter shares that runtime.
|
|
289
|
+
`attach` shows that plan and requires an
|
|
282
290
|
interactive confirmation or explicit `--yes` before granting the filesystem
|
|
283
291
|
effect and writing an isolated `agents/<name>` directory. `create project
|
|
284
292
|
agent.microsoft.python|dotnet` uses the same admitted lifecycle for a new
|
|
285
293
|
project: it registers the project, plans against a Model baseline, writes the
|
|
286
294
|
nested runtime, then re-observes Model/Graph before it claims Intelligence is
|
|
287
|
-
sealed.
|
|
295
|
+
sealed. `create project agent.openai.python|typescript` uses the same admitted
|
|
296
|
+
lifecycle. Dependency installation, credentials, generated-code execution, and
|
|
288
297
|
model provider calls are never implied by that approval. `apply` is the
|
|
289
298
|
automation counterpart for a plan that was separately authorized with
|
|
290
299
|
`change authorize`. Any adapter, version, manifest, runtime, or platform drift
|
|
@@ -394,9 +394,11 @@ project metadata and performs the selected workspace registration.
|
|
|
394
394
|
| ------------------------ | ------- | --------------- | ------ |
|
|
395
395
|
| `agent.microsoft.python` | Python | `agent-framework-core` `1.18.0`, Foundry `1.13.0`, `azure-identity` `1.25.3` | Isolated `agents/<instance>/` with `pyproject.toml`, credentialless `unittest`, and `.env.example` |
|
|
396
396
|
| `agent.microsoft.dotnet` | .NET | `Microsoft.Agents.AI` `1.21.0`, Foundry `1.21.0-preview.260911.1` | Isolated `agents/<instance>/` with the executable project plus a dedicated test project |
|
|
397
|
+
| `agent.openai.python` | Python | `openai-agents` `0.22.2` | Isolated `agents/<instance>/` with pip-editable `pyproject.toml`, credentialless `unittest`, and `.env.example` |
|
|
398
|
+
| `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` |
|
|
397
399
|
|
|
398
|
-
Interactive `workspai create` shows these kits under **AI Agent**
|
|
399
|
-
release admission. Agent kits require Workspace governance and therefore do not
|
|
400
|
+
Interactive `workspai create` shows these kits under **AI Agent** after
|
|
401
|
+
reviewed release admission. Agent kits require Workspace governance and therefore do not
|
|
400
402
|
accept `--no-workspace`. Optional `--agent-name` names the instance directory
|
|
401
403
|
(default `primary`). They do not install dependencies, call a model, or store
|
|
402
404
|
credentials. Exact versions are promoted only after the full Linux, macOS, and
|
package/docs/doctor-command.md
CHANGED
|
@@ -775,10 +775,12 @@ 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
|
-
`microsoft-agent-framework
|
|
780
|
-
|
|
781
|
-
|
|
778
|
+
- Governed Microsoft Agent Framework and OpenAI Agents SDK projects keep
|
|
779
|
+
`kind` as `agent`. Microsoft retains `microsoft-agent-framework`; OpenAI
|
|
780
|
+
retains `openai-agents`. Doctor discovers nested environment examples and
|
|
781
|
+
dependency manifests under `agents/primary` and aims Python/`uv`, Node
|
|
782
|
+
`npm --prefix`, or .NET repair commands at that runtime, not at a phantom
|
|
783
|
+
project-root manifest.
|
|
782
784
|
|
|
783
785
|
## Project JSON fields (AI/automation)
|
|
784
786
|
|
|
@@ -12,7 +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 kits are versioned
|
|
15
|
+
Governed Microsoft Agent Framework and OpenAI Agents SDK kits are versioned
|
|
16
|
+
separately through the
|
|
16
17
|
[Agent Framework Adapter Contract](./agent-framework-adapters.md); they are
|
|
17
18
|
not native HTTP service generators.
|
|
18
19
|
|
package/docs/workspace-run.md
CHANGED
|
@@ -52,7 +52,9 @@ Microsoft Agent Framework projects keep their executable manifest under
|
|
|
52
52
|
`agents/<instance>/`. Workspace Run treats that nested `pyproject.toml` or
|
|
53
53
|
`.csproj` as its own unit (`python3 -m compileall .`,
|
|
54
54
|
`python3 -m unittest discover -s tests`, `python3 main.py`, or the matching
|
|
55
|
-
.NET commands).
|
|
55
|
+
.NET commands). A Python unit with `main.py` uses `compileall` even when
|
|
56
|
+
`pyproject.toml` declares `[build-system]`; `python -m build` remains only for
|
|
57
|
+
packaging projects that have no agent entrypoint. An empty legacy root manifest is ignored only when it still
|
|
56
58
|
matches the exact older Workspai shell and a real `agents/primary` runtime
|
|
57
59
|
exists. Any user edit restores the root as an independent unit.
|
|
58
60
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "workspai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.76.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": [
|
|
@@ -115,6 +115,8 @@
|
|
|
115
115
|
"test:runtime-contract": "node scripts/runtime-acceptance-matrix.mjs --contract-only",
|
|
116
116
|
"test:agent-framework:python": "tsx scripts/smoke-microsoft-agent-framework-adapter.ts --runtime python",
|
|
117
117
|
"test:agent-framework:dotnet": "tsx scripts/smoke-microsoft-agent-framework-adapter.ts --runtime dotnet",
|
|
118
|
+
"test:agent-framework:openai:python": "tsx scripts/smoke-openai-agents-adapter.ts --runtime python",
|
|
119
|
+
"test:agent-framework:openai:typescript": "tsx scripts/smoke-openai-agents-adapter.ts --runtime typescript",
|
|
118
120
|
"verify:agent-framework:matrix": "tsx scripts/verify-agent-framework-conformance.ts --reports test-results/agent-framework-conformance",
|
|
119
121
|
"discover:agent-framework:versions": "tsx scripts/discover-agent-framework-versions.ts",
|
|
120
122
|
"propose:agent-framework:versions": "tsx scripts/propose-agent-framework-version-update.ts",
|
|
@@ -9,6 +9,7 @@ import process from 'node:process';
|
|
|
9
9
|
const repoRoot = process.cwd();
|
|
10
10
|
const cliPath = path.join(repoRoot, 'dist', 'index.js');
|
|
11
11
|
const isolatedHome = fs.mkdtempSync(path.join(os.tmpdir(), 'workspai-enterprise-home-'));
|
|
12
|
+
let releaseAdmittedAdapterIds = new Set();
|
|
12
13
|
|
|
13
14
|
process.on('exit', () => {
|
|
14
15
|
fs.rmSync(isolatedHome, { recursive: true, force: true });
|
|
@@ -348,12 +349,43 @@ function assertCliContracts() {
|
|
|
348
349
|
}
|
|
349
350
|
|
|
350
351
|
const frameworks = parseTrailingJson(runCli(['agent', 'framework', 'list', '--json']));
|
|
352
|
+
if (frameworks.schemaVersion !== 'workspai.agent-framework-list.v1') {
|
|
353
|
+
fail(`unexpected agent framework list schema: ${frameworks.schemaVersion}`);
|
|
354
|
+
}
|
|
355
|
+
const adapters = Array.isArray(frameworks.adapters) ? frameworks.adapters : [];
|
|
356
|
+
const admittedIds = adapters
|
|
357
|
+
.filter((adapter) => adapter.status === 'admitted')
|
|
358
|
+
.map((adapter) => adapter.id)
|
|
359
|
+
.sort();
|
|
360
|
+
const expectedAdapterIds = [
|
|
361
|
+
'microsoft-agent-framework-dotnet',
|
|
362
|
+
'microsoft-agent-framework-python',
|
|
363
|
+
'openai-agents-python',
|
|
364
|
+
'openai-agents-typescript',
|
|
365
|
+
];
|
|
351
366
|
if (
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
frameworks.adapters.some((adapter) => adapter.status !== 'admitted')
|
|
367
|
+
admittedIds.length !== 0 &&
|
|
368
|
+
JSON.stringify(admittedIds) !== JSON.stringify(expectedAdapterIds)
|
|
355
369
|
) {
|
|
356
|
-
fail(
|
|
370
|
+
fail(
|
|
371
|
+
`published CLI does not expose the exact release-admitted framework adapters (admitted: ${
|
|
372
|
+
admittedIds.join(', ') || 'none'
|
|
373
|
+
})`
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
releaseAdmittedAdapterIds = new Set(admittedIds);
|
|
377
|
+
for (const openaiId of ['openai-agents-python', 'openai-agents-typescript']) {
|
|
378
|
+
const openai = adapters.find((adapter) => adapter.id === openaiId);
|
|
379
|
+
if (!openai) {
|
|
380
|
+
fail(`published CLI is missing implemented OpenAI adapter ${openaiId}`);
|
|
381
|
+
}
|
|
382
|
+
if (openai.stability !== 'stable') {
|
|
383
|
+
fail(
|
|
384
|
+
`${openaiId} must be labeled stable after the digest-changing promotion (observed: ${
|
|
385
|
+
openai.stability ?? 'missing'
|
|
386
|
+
})`
|
|
387
|
+
);
|
|
388
|
+
}
|
|
357
389
|
}
|
|
358
390
|
|
|
359
391
|
log(`verified CLI contract surfaces for v${version.version}`);
|
|
@@ -390,6 +422,7 @@ function smokeCreateAgentFrameworkKits() {
|
|
|
390
422
|
{
|
|
391
423
|
kit: 'agent.microsoft.python',
|
|
392
424
|
name: 'python-agent',
|
|
425
|
+
expectCreate: releaseAdmittedAdapterIds.has('microsoft-agent-framework-python'),
|
|
393
426
|
expectedFiles: [
|
|
394
427
|
'README.md',
|
|
395
428
|
'.workspai/project.json',
|
|
@@ -404,6 +437,7 @@ function smokeCreateAgentFrameworkKits() {
|
|
|
404
437
|
{
|
|
405
438
|
kit: 'agent.microsoft.dotnet',
|
|
406
439
|
name: 'dotnet-agent',
|
|
440
|
+
expectCreate: releaseAdmittedAdapterIds.has('microsoft-agent-framework-dotnet'),
|
|
407
441
|
expectedFiles: [
|
|
408
442
|
'README.md',
|
|
409
443
|
'.workspai/project.json',
|
|
@@ -417,6 +451,41 @@ function smokeCreateAgentFrameworkKits() {
|
|
|
417
451
|
'agents/primary/README.md',
|
|
418
452
|
],
|
|
419
453
|
},
|
|
454
|
+
{
|
|
455
|
+
kit: 'agent.openai.python',
|
|
456
|
+
name: 'openai-python-agent',
|
|
457
|
+
expectCreate: releaseAdmittedAdapterIds.has('openai-agents-python'),
|
|
458
|
+
expectedFiles: [
|
|
459
|
+
'README.md',
|
|
460
|
+
'.workspai/project.json',
|
|
461
|
+
'.workspai/agent-frameworks/openai-agents-python/primary.json',
|
|
462
|
+
'agents/primary/main.py',
|
|
463
|
+
'agents/primary/workspai_context.py',
|
|
464
|
+
'agents/primary/agent.py',
|
|
465
|
+
'agents/primary/pyproject.toml',
|
|
466
|
+
'agents/primary/tests/test_context.py',
|
|
467
|
+
'agents/primary/.env.example',
|
|
468
|
+
'agents/primary/README.md',
|
|
469
|
+
],
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
kit: 'agent.openai.typescript',
|
|
473
|
+
name: 'openai-typescript-agent',
|
|
474
|
+
expectCreate: releaseAdmittedAdapterIds.has('openai-agents-typescript'),
|
|
475
|
+
expectedFiles: [
|
|
476
|
+
'README.md',
|
|
477
|
+
'.workspai/project.json',
|
|
478
|
+
'.workspai/agent-frameworks/openai-agents-typescript/primary.json',
|
|
479
|
+
'agents/primary/src/main.ts',
|
|
480
|
+
'agents/primary/src/workspai-context.ts',
|
|
481
|
+
'agents/primary/src/agent.ts',
|
|
482
|
+
'agents/primary/package.json',
|
|
483
|
+
'agents/primary/tsconfig.json',
|
|
484
|
+
'agents/primary/tests/context.test.ts',
|
|
485
|
+
'agents/primary/.env.example',
|
|
486
|
+
'agents/primary/README.md',
|
|
487
|
+
],
|
|
488
|
+
},
|
|
420
489
|
];
|
|
421
490
|
try {
|
|
422
491
|
for (const scenario of scenarios) {
|
|
@@ -430,6 +499,22 @@ function smokeCreateAgentFrameworkKits() {
|
|
|
430
499
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
431
500
|
}
|
|
432
501
|
);
|
|
502
|
+
const combined = `${result.stdout}\n${result.stderr}`;
|
|
503
|
+
if (scenario.expectCreate === false) {
|
|
504
|
+
if (result.status === 0) {
|
|
505
|
+
fail(`${scenario.kit} create succeeded before the stable digest was release-admitted`);
|
|
506
|
+
}
|
|
507
|
+
if (
|
|
508
|
+
!/not release-admitted|adapter (?:manifest|implementation) changed after release admission/i.test(
|
|
509
|
+
combined
|
|
510
|
+
)
|
|
511
|
+
) {
|
|
512
|
+
fail(
|
|
513
|
+
`${scenario.kit} failed closed without an admission blocker\n${result.stdout}\n${result.stderr}`
|
|
514
|
+
);
|
|
515
|
+
}
|
|
516
|
+
continue;
|
|
517
|
+
}
|
|
433
518
|
if (result.status !== 0) {
|
|
434
519
|
fail(
|
|
435
520
|
`${scenario.kit} governed create failed with exit ${result.status}\n${result.stdout}\n${result.stderr}`
|
|
@@ -437,8 +522,16 @@ function smokeCreateAgentFrameworkKits() {
|
|
|
437
522
|
}
|
|
438
523
|
assertGeneratedProject(path.join(workspacePath, scenario.name), scenario.expectedFiles);
|
|
439
524
|
}
|
|
525
|
+
const admittedCreates = scenarios.filter((scenario) => scenario.expectCreate);
|
|
440
526
|
const ownershipRoot = path.join(workspacePath, '.workspai', 'agent-frameworks', 'ownership');
|
|
441
|
-
|
|
527
|
+
const recordedOwnership = fs.existsSync(ownershipRoot);
|
|
528
|
+
if (admittedCreates.length === 0) {
|
|
529
|
+
if (recordedOwnership) {
|
|
530
|
+
fail('agent kit smoke recorded ownership receipts without a release-admitted create');
|
|
531
|
+
}
|
|
532
|
+
} else if (!recordedOwnership) {
|
|
533
|
+
fail('agent kit smoke did not record ownership receipts');
|
|
534
|
+
}
|
|
442
535
|
} finally {
|
|
443
536
|
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
444
537
|
}
|
package/dist/analyze-6UEBC5OJ.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{b as printAnalyzeReport,a as runAnalyze}from'./chunk-K52IQX3J.js';
|