@nifrajs/cli 3.2.0 → 3.3.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/dist/cli.js +1 -1
- package/dist/mcp-http.js +1 -1
- package/docs/examples.json +10 -4
- package/docs/llms-full.txt +131 -25
- package/docs/types.json +5 -5
- package/package.json +9 -9
- package/src/cli.ts +1 -1
- package/src/mcp-http.ts +1 -1
package/dist/cli.js
CHANGED
|
@@ -192,7 +192,7 @@ set in the process environment is never overwritten by a file.
|
|
|
192
192
|
|
|
193
193
|
${renderCommandCatalogHelp()}`;
|
|
194
194
|
// Kept in lockstep with packages/cli/package.json by check:publish's version-consistency gate.
|
|
195
|
-
const CLI_VERSION = "3.
|
|
195
|
+
const CLI_VERSION = "3.3.0";
|
|
196
196
|
// A render adapter + nifra server are opaque to the CLI (it just forwards them); cast at the seam.
|
|
197
197
|
const asAdapter = (v) => v;
|
|
198
198
|
const asBunPlugins = (v) => v;
|
package/dist/mcp-http.js
CHANGED
|
@@ -23,7 +23,7 @@ import { loadTypesCorpus } from "./types-search.js";
|
|
|
23
23
|
export { examplesAppTool, examplesWidget } from "./mcp-app-tool.js";
|
|
24
24
|
export { docsTools } from "./mcp-docs-tools.js";
|
|
25
25
|
// Kept in lockstep with packages/cli/package.json by check:publish's version-consistency gate.
|
|
26
|
-
const VERSION = "3.
|
|
26
|
+
const VERSION = "3.3.0";
|
|
27
27
|
const SERVER_INFO = { name: "nifra-docs", version: VERSION };
|
|
28
28
|
// Derive the GET/health tool list from the tools actually served, so the line can never drift from them.
|
|
29
29
|
const docsHealth = (tools) => `nifra docs MCP - POST JSON-RPC 2.0 here (methods: initialize, tools/list, tools/call). Tools: ${tools
|
package/docs/examples.json
CHANGED
|
@@ -361,19 +361,19 @@
|
|
|
361
361
|
},
|
|
362
362
|
{
|
|
363
363
|
"name": "BUILD",
|
|
364
|
-
"topic": "Nifra - Rendering: SSG & ISR",
|
|
364
|
+
"topic": "Nifra - Rendering: SSR, streaming, SSG & ISR",
|
|
365
365
|
"slug": "rendering",
|
|
366
366
|
"code": "// build.ts - buildClient, then prerender opted-in routes to static HTML.\nimport { buildClient, prerenderRoutes, cloudflarePagesRoutes } from \"@nifrajs/web/build\"\nimport { discoverRoutes } from \"@nifrajs/web/fs\"\n\nawait buildClient({ routesDir: \"./routes\", outDir: \"./dist\", clientModule: \"@nifrajs/web-react/client\" })\nconst { app } = await import(\"./server\")\nconst { prerendered } = await prerenderRoutes({\n app,\n routes: discoverRoutes(\"./routes\").routes,\n outDir: \"./dist\", // writes <path>/index.html + <path>/_data.json per prerendered route\n})\n\n// Hybrid deploy (Cloudflare Pages): serve prerendered HTML + _data.json from the CDN; everything\n// else falls through to the SSR worker.\nconst paths = prerendered.map((p) => p.path)\nBun.write(\"./dist/_routes.json\", JSON.stringify(cloudflarePagesRoutes({ prerendered: paths })))"
|
|
367
367
|
},
|
|
368
368
|
{
|
|
369
369
|
"name": "FONTS",
|
|
370
|
-
"topic": "Nifra - Rendering: SSG & ISR",
|
|
370
|
+
"topic": "Nifra - Rendering: SSR, streaming, SSG & ISR",
|
|
371
371
|
"slug": "rendering",
|
|
372
372
|
"code": "// fonts.css - a CLS-safe @font-face for a self-hosted font (the pipeline bundles + hashes it).\nimport { fontFace } from \"@nifrajs/web\"\nexport default fontFace({\n family: \"Inter\",\n src: [{ url: \"/fonts/inter-var.woff2\" }], // self-host it - never hotlink a CDN\n weight: \"100 900\", // variable font\n sizeAdjust: \"100.06%\", ascentOverride: \"90%\", // optional: stop fallback->web-font layout shift\n})\n\n// a root layout - preload the file so it downloads WITH the document (not after CSS parse):\nimport { fontPreload } from \"@nifrajs/web\"\nexport const meta = { link: [fontPreload({ href: \"/fonts/inter-var.woff2\" })] }"
|
|
373
373
|
},
|
|
374
374
|
{
|
|
375
375
|
"name": "ISR",
|
|
376
|
-
"topic": "Nifra - Rendering: SSG & ISR",
|
|
376
|
+
"topic": "Nifra - Rendering: SSR, streaming, SSG & ISR",
|
|
377
377
|
"slug": "rendering",
|
|
378
378
|
"code": "// server.ts - wrap the app with Incremental Static Regeneration.\nimport { createWebApp, withISR, MemoryCacheStore } from \"@nifrajs/web\"\nimport { reactAdapter } from \"@nifrajs/web-react\"\nimport { clientEntry, manifest } from \"./server-manifest\" // generated by buildServer\n\nconst app = createWebApp({ adapter: reactAdapter, manifest, clientEntry })\nconst store = new MemoryCacheStore() // dev / single-instance only\n\n// GET text/html responses are cached + served stale-while-revalidate. Default freshness 60s.\nconst isr = withISR(app, { store, revalidate: 60, now: () => Date.now() })\nBun.serve({ fetch: (req) => isr(req) })"
|
|
379
379
|
},
|
|
@@ -473,6 +473,12 @@
|
|
|
473
473
|
"slug": "types-first",
|
|
474
474
|
"code": "import { client } from \"@nifrajs/client\"\nimport type { app } from \"./server\" // a TYPE import - server code never ships to the client\n\nconst api = client<typeof app>(\"https://api.example.com\")\n\nconst res = await api.users({ id: \"42\" }).get() // path + params autocomplete, no codegen\nif (res.ok) {\n res.data.name // typed from the route's response schema\n} else {\n res.error // client-call failures are returned, never thrown\n}"
|
|
475
475
|
},
|
|
476
|
+
{
|
|
477
|
+
"name": "INLINE",
|
|
478
|
+
"topic": "Nifra - Types-first architecture",
|
|
479
|
+
"slug": "types-first",
|
|
480
|
+
"code": "import { server } from \"@nifrajs/core/server\"\n\nexport const app = server()\n .get(\"/users/:id\", (c) => ({ id: c.params.id, name: \"Ada\" }))\n // c.params.id is inferred from the path; the return type becomes the client response.\n .post(\"/users\", () => ({ created: true }))\n\n// No schema, annotation, or codegen is required for the route types."
|
|
481
|
+
},
|
|
476
482
|
{
|
|
477
483
|
"name": "OPENAPI",
|
|
478
484
|
"topic": "Nifra - Types-first architecture",
|
|
@@ -489,7 +495,7 @@
|
|
|
489
495
|
"name": "SCHEMA",
|
|
490
496
|
"topic": "Nifra - Types-first architecture",
|
|
491
497
|
"slug": "types-first",
|
|
492
|
-
"code": "import { t } from \"@nifrajs/schema\"\n\n//
|
|
498
|
+
"code": "import { t } from \"@nifrajs/schema\"\n\n// Add a schema when the boundary needs runtime validation or a declared contract.\nexport const GetUser = {\n params: t.object({ id: t.string() }),\n response: t.object({\n id: t.string(),\n name: t.string(),\n role: t.union([t.literal(\"admin\"), t.literal(\"user\")]),\n }),\n}"
|
|
493
499
|
},
|
|
494
500
|
{
|
|
495
501
|
"name": "BASIC",
|
package/docs/llms-full.txt
CHANGED
|
@@ -958,15 +958,48 @@ function Row({ id }: { id: string }) {
|
|
|
958
958
|
const anyPending = useFetchers().some((f) => f.snapshot().pending)
|
|
959
959
|
```
|
|
960
960
|
|
|
961
|
-
## Nifra - Rendering: SSG & ISR
|
|
961
|
+
## Nifra - Rendering: SSR, streaming, SSG & ISR
|
|
962
962
|
|
|
963
|
-
>
|
|
963
|
+
> Render critical HTML first, stream deferred data progressively, prerender static routes, and cache rendered pages with stale-while-revalidate - on every runtime including the edge.
|
|
964
964
|
|
|
965
965
|
Nifra renders on one framework-agnostic seam, so the same app can be server-rendered per
|
|
966
|
-
request (the default), **prerendered** to static files at build (SSG), or cached and served
|
|
966
|
+
request (the default), streamed progressively, **prerendered** to static files at build (SSG), or cached and served
|
|
967
967
|
**stale-while-revalidate** (ISR) - and every strategy works on Bun, Node, Deno, **and**
|
|
968
968
|
the edge.
|
|
969
969
|
|
|
970
|
+
### Progressive rendering with `defer()`
|
|
971
|
+
|
|
972
|
+
Keep critical loader data in the first HTML shell and mark slower, non-critical values with
|
|
973
|
+
`defer()`. Nifra flushes the document shell and the adapter's rendered stream first,
|
|
974
|
+
then sends each deferred resolution through `<Await>` without a second data
|
|
975
|
+
fetch. The same protocol works for actions and soft navigations, including NDJSON on the client
|
|
976
|
+
side.
|
|
977
|
+
|
|
978
|
+
```ts
|
|
979
|
+
import { defer } from "@nifrajs/web"
|
|
980
|
+
|
|
981
|
+
export async function loader({ api }: LoaderArgs<typeof app>) {
|
|
982
|
+
return {
|
|
983
|
+
product: (await api.products.get()).data, // critical: rendered in the first shell
|
|
984
|
+
reviews: defer(api.reviews.get()), // non-critical: streamed when ready
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
export default function Product(props: { data: LoaderData<typeof loader> }) {
|
|
989
|
+
return (
|
|
990
|
+
<>
|
|
991
|
+
<ProductSummary product={props.data.product} />
|
|
992
|
+
<Await resolve={props.data.reviews} fallback={<p>Loading reviews…</p>}>
|
|
993
|
+
{(reviews) => <Reviews items={reviews} />}
|
|
994
|
+
</Await>
|
|
995
|
+
</>
|
|
996
|
+
)
|
|
997
|
+
}
|
|
998
|
+
```
|
|
999
|
+
|
|
1000
|
+
This is request-time progressive SSR/partial rendering. It is distinct from build-time SSG:
|
|
1001
|
+
the shell is not a precomputed PPR artifact, and deferred values remain request-scoped.
|
|
1002
|
+
|
|
970
1003
|
### SSG - prerender at build
|
|
971
1004
|
|
|
972
1005
|
Opt a static route into prerendering with `export const prerender = true`. Its
|
|
@@ -4240,7 +4273,7 @@ the command printed by the build.
|
|
|
4240
4273
|
|
|
4241
4274
|
## Nifra - Coding agents
|
|
4242
4275
|
|
|
4243
|
-
> Nifra's agent layer: live MCP tools
|
|
4276
|
+
> Nifra's agent layer: live MCP tools, bounded repairable turns, native approvals, resumable evidence, content-free browser views, capability registry, decision inbox, Run Studio, A2A, and AG-UI.
|
|
4244
4277
|
|
|
4245
4278
|
Nifra ships an MCP server. It is not a documentation lookup bolted onto a framework: an agent
|
|
4246
4279
|
can read the project, learn the real API, run actual requests against the backend it just
|
|
@@ -4324,6 +4357,8 @@ nifra_check # typecheck + lints, each with a structured fix
|
|
|
4324
4357
|
nifra_fix # applies the mechanical ones
|
|
4325
4358
|
nifra_run {request} # a real request through the backend: status, headers, parsed body
|
|
4326
4359
|
nifra_render {path} # SSR a page route, returns the HTML
|
|
4360
|
+
nifra_inspect {port} # recent dev-server request traces: status, duration, ISR hit/miss
|
|
4361
|
+
nifra_explain {error} # turn a failure into a structured diagnostic and fix
|
|
4327
4362
|
nifra_test # bun test, bounded structured results
|
|
4328
4363
|
|
|
4329
4364
|
# 4. What does it now prove?
|
|
@@ -4465,8 +4500,28 @@ bunx nifra-agent --backend pi --message "run the checks and explain failures"
|
|
|
4465
4500
|
```
|
|
4466
4501
|
|
|
4467
4502
|
The public host keeps live queues and captured evidence bounded, filters verification process
|
|
4468
|
-
environments, and treats extensions as an explicit opt-in.
|
|
4469
|
-
|
|
4503
|
+
environments, and treats extensions as an explicit opt-in. Post-turn `check`,
|
|
4504
|
+
`assure`, or `test` gates emit `verification.completed` and
|
|
4505
|
+
`repair.required`; when enabled, the host sends a bounded repair prompt and reruns
|
|
4506
|
+
the gate until it passes or the attempt cap is reached. The local process adapter and extension
|
|
4507
|
+
worker are crash-containment helpers, not hostile-code sandboxes.
|
|
4508
|
+
|
|
4509
|
+
```ts
|
|
4510
|
+
# Post-turn gates are opt-in. A failed gate becomes bounded repair work.
|
|
4511
|
+
bunx nifra-agent --backend pi --message "implement the change" \
|
|
4512
|
+
--verify-after-turn check,assure --max-repair-attempts 2
|
|
4513
|
+
|
|
4514
|
+
# Set --max-repair-attempts 0 for observe-only verification.
|
|
4515
|
+
```
|
|
4516
|
+
|
|
4517
|
+
### Native approval protocol
|
|
4518
|
+
|
|
4519
|
+
`@nifrajs/coding-agent` can pause a native tool call at the decision boundary and
|
|
4520
|
+
emit `approval.required` with an opaque approval id, action, capability, and bounded
|
|
4521
|
+
coordinates. Resolve it through the host or RPC with `approval.resolve`; the backend
|
|
4522
|
+
emits `approval.resolved` and only then executes the tool. Denial, cancellation,
|
|
4523
|
+
timeout, and closed sessions all fail closed, and `approvalTimeoutMs` bounds how long
|
|
4524
|
+
a pending decision can remain open.
|
|
4470
4525
|
|
|
4471
4526
|
### Expose the same agent to other clients
|
|
4472
4527
|
|
|
@@ -4509,11 +4564,15 @@ auth and authorization middleware, and scope every injected port to the request
|
|
|
4509
4564
|
### Browser views and the Workbench
|
|
4510
4565
|
|
|
4511
4566
|
`@nifrajs/agent-app` is a backend-free browser SDK for negotiated commands, ordered
|
|
4512
|
-
and resumable event streams, approvals, handoffs, and Run Studio projections.
|
|
4513
|
-
|
|
4514
|
-
|
|
4515
|
-
|
|
4516
|
-
|
|
4567
|
+
and resumable event streams, approvals, handoffs, and Run Studio projections. It negotiates
|
|
4568
|
+
optional features including `approvals`, `checkpoint`,
|
|
4569
|
+
`fork`, `handoff`, `inbox`, `reload`,
|
|
4570
|
+
`resume`, and `workflows`, so a browser can degrade deliberately when a
|
|
4571
|
+
host does not offer one. Its public views contain structure - statuses, counters, coordinates,
|
|
4572
|
+
and error codes - rather than prompts, tool payloads, model output, or filesystem paths. The
|
|
4573
|
+
optional Workbench uses that same surface: run
|
|
4574
|
+
`bun run --filter '@nifrajs/workbench' dev -- --cwd /path/to/project` for the local
|
|
4575
|
+
browser client.
|
|
4517
4576
|
|
|
4518
4577
|
```ts
|
|
4519
4578
|
import { AgentAppClient, HttpAgentTransport } from "@nifrajs/agent-app"
|
|
@@ -4532,14 +4591,30 @@ for await (const view of client.send("summarize the diff")) {
|
|
|
4532
4591
|
}
|
|
4533
4592
|
```
|
|
4534
4593
|
|
|
4594
|
+
### Capability registry, decision inbox, and Run Studio
|
|
4595
|
+
|
|
4596
|
+
The Workbench's `registry.list` view shows content-free identity cards for admitted
|
|
4597
|
+
capabilities: kind, name, version, schema digest, required capability tokens, and approval,
|
|
4598
|
+
retry, idempotency, and isolation classes. It never renders a prompt, input schema, tool
|
|
4599
|
+
payload, model output, or filesystem path.
|
|
4600
|
+
|
|
4601
|
+
The `inbox` feature lists pending approval and handoff boundaries by exact structural
|
|
4602
|
+
coordinate - run, node, capability, child vector, request id, and expiry. Every approve, deny,
|
|
4603
|
+
assign, resolve, or cancel command carries that coordinate, so stale, mismatched, or expired
|
|
4604
|
+
decisions are refused by the host. `run.studio` projects the same bounded evidence
|
|
4605
|
+
into a run graph, retry/recovery timeline, eval comparison, and deterministic fault-injection
|
|
4606
|
+
view. These are presentation-safe views: content stays in the host.
|
|
4607
|
+
|
|
4535
4608
|
### Evidence, streaming, and telemetry
|
|
4536
4609
|
|
|
4537
4610
|
`@nifrajs/agent` runs bounded typed turns with tool contracts, budgets, approvals,
|
|
4538
4611
|
resumable token-only evidence, model deltas, and a transient shared-state channel. Add an
|
|
4539
4612
|
`evidenceLog` to the HTTP seams for SSE replay after a dropped connection; replay
|
|
4540
|
-
resumes evidence and never re-executes the turn.
|
|
4541
|
-
|
|
4542
|
-
|
|
4613
|
+
resumes evidence and never re-executes the turn. The additive run-lifecycle contract supplies
|
|
4614
|
+
content-free snapshots, ordered evidence refs, feature negotiation, handoff state, and cursor
|
|
4615
|
+
resume. `@nifrajs/agent-telemetry` converts the same constrained evidence into
|
|
4616
|
+
fail-open OpenTelemetry run and step spans. Providers, credentials, durable storage, retention,
|
|
4617
|
+
and tenant policy remain application-owned ports.
|
|
4543
4618
|
|
|
4544
4619
|
### Projects without a web config
|
|
4545
4620
|
|
|
@@ -7962,21 +8037,41 @@ isolated fixtures and a test database. Never point a contract laboratory at prod
|
|
|
7962
8037
|
|
|
7963
8038
|
## Nifra - Types-first architecture
|
|
7964
8039
|
|
|
7965
|
-
>
|
|
8040
|
+
> Nifra infers route types from path literals and handlers automatically, with optional Standard Schemas for validation, explicit contracts, OpenAPI, and agent-readable APIs.
|
|
8041
|
+
|
|
8042
|
+
Nifra starts with automatic inference. A route's path literal, handler context, and return
|
|
8043
|
+
value produce its TypeScript surface; add a Standard Schema when you need runtime validation,
|
|
8044
|
+
coercion, or an explicit request/response contract. The same server type then drives the
|
|
8045
|
+
no-codegen client and the agent-readable API surface.
|
|
8046
|
+
|
|
8047
|
+
### Inline inference first
|
|
8048
|
+
|
|
8049
|
+
The chainable builder is fully type-inferred. Path parameters are parsed from the route
|
|
8050
|
+
pattern, handler context is typed automatically, and plain return values become the success
|
|
8051
|
+
response seen by the client. This is the quick-start style, similar to Elysia's inline route
|
|
8052
|
+
inference.
|
|
7966
8053
|
|
|
7967
|
-
|
|
7968
|
-
|
|
7969
|
-
|
|
8054
|
+
```ts
|
|
8055
|
+
import { server } from "@nifrajs/core/server"
|
|
8056
|
+
|
|
8057
|
+
export const app = server()
|
|
8058
|
+
.get("/users/:id", (c) => ({ id: c.params.id, name: "Ada" }))
|
|
8059
|
+
// c.params.id is inferred from the path; the return type becomes the client response.
|
|
8060
|
+
.post("/users", () => ({ created: true }))
|
|
7970
8061
|
|
|
7971
|
-
|
|
8062
|
+
// No schema, annotation, or codegen is required for the route types.
|
|
8063
|
+
```
|
|
8064
|
+
|
|
8065
|
+
### Schemas at the trust boundary
|
|
7972
8066
|
|
|
7973
|
-
|
|
7974
|
-
|
|
8067
|
+
Attach a Standard Schema when inputs must be validated before the handler runs, or when you
|
|
8068
|
+
want an explicit response contract. Path params are already inferred from `:id`;
|
|
8069
|
+
the `params` schema below adds runtime constraints/coercion as well.
|
|
7975
8070
|
|
|
7976
8071
|
```ts
|
|
7977
8072
|
import { t } from "@nifrajs/schema"
|
|
7978
8073
|
|
|
7979
|
-
//
|
|
8074
|
+
// Add a schema when the boundary needs runtime validation or a declared contract.
|
|
7980
8075
|
export const GetUser = {
|
|
7981
8076
|
params: t.object({ id: t.string() }),
|
|
7982
8077
|
response: t.object({
|
|
@@ -8006,9 +8101,10 @@ export const app = server().get("/users/:id", GetUser, (c) => {
|
|
|
8006
8101
|
|
|
8007
8102
|
### Inferred types
|
|
8008
8103
|
|
|
8009
|
-
|
|
8010
|
-
|
|
8011
|
-
|
|
8104
|
+
Without a schema, `c.params.id` is still `string` and the handler return
|
|
8105
|
+
is captured automatically. With a schema, its output types the handler and its declared
|
|
8106
|
+
`response` constrains what the handler may return. Change either the route or the
|
|
8107
|
+
contract and the typed client follows at compile time.
|
|
8012
8108
|
|
|
8013
8109
|
### The typed client
|
|
8014
8110
|
|
|
@@ -8030,6 +8126,16 @@ if (res.ok) {
|
|
|
8030
8126
|
}
|
|
8031
8127
|
```
|
|
8032
8128
|
|
|
8129
|
+
### Contract-first when the surface must be separate
|
|
8130
|
+
|
|
8131
|
+
Inline inference is the default. If the API needs to be shared, versioned, or implemented by
|
|
8132
|
+
more than one service, declare it with `defineContract` and connect handlers with
|
|
8133
|
+
`implement`. That keeps the contract type available without importing a server
|
|
8134
|
+
implementation into the client.
|
|
8135
|
+
|
|
8136
|
+
See [Framework contract](/docs/contract) for the decoupled form and its scaling
|
|
8137
|
+
guidance.
|
|
8138
|
+
|
|
8033
8139
|
### OpenAPI
|
|
8034
8140
|
|
|
8035
8141
|
The `openapi()` middleware builds an OpenAPI 3.1 document from your registered
|
package/docs/types.json
CHANGED
|
@@ -10237,7 +10237,7 @@
|
|
|
10237
10237
|
"name": "NativeApprovalPort",
|
|
10238
10238
|
"kind": "interface",
|
|
10239
10239
|
"package": "@nifrajs/coding-agent",
|
|
10240
|
-
"signature": "export interface NativeApprovalPort {\n request(input: {\n readonly sessionId: string;\n readonly tool: NativeTool;\n readonly input: unknown;\n readonly signal: AbortSignal;\n }): boolean | PromiseLike<boolean>;\n}"
|
|
10240
|
+
"signature": "export interface NativeApprovalPort {\n request(input: {\n readonly sessionId: string;\n /** Stable, bounded identifier for this approval boundary. */\n readonly approvalId: string;\n readonly turnId: string;\n readonly callId: string;\n readonly action: string;\n readonly capability: string;\n readonly tool: NativeTool;\n readonly input: unknown;\n readonly signal: AbortSignal;\n }): boolean | PromiseLike<boolean>;\n}"
|
|
10241
10241
|
},
|
|
10242
10242
|
{
|
|
10243
10243
|
"name": "NativeGatewayModelPortOptions",
|
|
@@ -10528,14 +10528,14 @@
|
|
|
10528
10528
|
"name": "NifraBackend",
|
|
10529
10529
|
"kind": "class",
|
|
10530
10530
|
"package": "@nifrajs/coding-agent",
|
|
10531
|
-
"signature": "export declare class NifraBackend implements AgentBackend {\n readonly info: AgentBackendInfo;\n private readonly options;\n private readonly sessions;\n constructor(options: NifraBackendOptions);\n createSession(input: CreateSessionInput): Promise<AgentSessionSnapshot>;\n send(input: SendMessageInput): AsyncIterable<AgentEvent>;\n cancel(sessionId: string, reason?: string): Promise<void>;\n snapshot(sessionId: string): Promise<AgentSessionSnapshot>;\n reload(sessionId: string): Promise<ReloadResult>;\n close(sessionId: string): Promise<void>;\n private run;\n private consumeModel;\n private finish;\n private emit;\n private update;\n private requireSession;\n private now;\n}",
|
|
10531
|
+
"signature": "export declare class NifraBackend implements AgentBackend {\n readonly info: AgentBackendInfo;\n private readonly options;\n private readonly sessions;\n private readonly pendingApprovals;\n constructor(options: NifraBackendOptions);\n createSession(input: CreateSessionInput): Promise<AgentSessionSnapshot>;\n send(input: SendMessageInput): AsyncIterable<AgentEvent>;\n cancel(sessionId: string, reason?: string): Promise<void>;\n snapshot(sessionId: string): Promise<AgentSessionSnapshot>;\n reload(sessionId: string): Promise<ReloadResult>;\n resolveApproval(sessionId: string, approvalId: string, approved: boolean, reason?: string): Promise<boolean | undefined>;\n close(sessionId: string): Promise<void>;\n private run;\n private consumeModel;\n private finish;\n private requestApproval;\n private settleApproval;\n private emit;\n private update;\n private requireSession;\n private now;\n}",
|
|
10532
10532
|
"doc": "/**\n * Small provider port for a future Nifra-native backend.\n *\n * It deliberately knows only messages, tools, and the protocol. Provider SDKs, credentials, UI,\n * and framework packages stay outside this module. A model may return one response or stream\n * deltas followed by a final response.\n */"
|
|
10533
10533
|
},
|
|
10534
10534
|
{
|
|
10535
10535
|
"name": "NifraBackendOptions",
|
|
10536
10536
|
"kind": "interface",
|
|
10537
10537
|
"package": "@nifrajs/coding-agent",
|
|
10538
|
-
"signature": "export interface NifraBackendOptions {\n readonly model: NativeModelPort;\n readonly tools?: readonly NativeTool[];\n readonly approval?: NativeApprovalPort;\n readonly maxSteps?: number;\n readonly maxMessageChars?: number;\n readonly now?: () => number;\n}"
|
|
10538
|
+
"signature": "export interface NifraBackendOptions {\n readonly model: NativeModelPort;\n readonly tools?: readonly NativeTool[];\n readonly approval?: NativeApprovalPort;\n /** Maximum time a protocol-visible native approval may remain unresolved. */\n readonly approvalTimeoutMs?: number;\n readonly maxSteps?: number;\n readonly maxMessageChars?: number;\n readonly now?: () => number;\n}"
|
|
10539
10539
|
},
|
|
10540
10540
|
{
|
|
10541
10541
|
"name": "NifraContextLike",
|
|
@@ -18148,14 +18148,14 @@
|
|
|
18148
18148
|
"name": "VERSION",
|
|
18149
18149
|
"kind": "const",
|
|
18150
18150
|
"package": "@nifrajs/core",
|
|
18151
|
-
"signature": "export declare const VERSION: \"3.
|
|
18151
|
+
"signature": "export declare const VERSION: \"3.3.0\";",
|
|
18152
18152
|
"doc": "/**\n * Current package version. A hardcoded literal on purpose - core runs on the edge (no fs), so it can't\n * read its own package.json at runtime. `scripts/version.ts` rewrites it on every release bump and\n * `check:publish` asserts it equals `@nifrajs/core`'s package version.\n */"
|
|
18153
18153
|
},
|
|
18154
18154
|
{
|
|
18155
18155
|
"name": "VERSION",
|
|
18156
18156
|
"kind": "const",
|
|
18157
18157
|
"package": "nifra",
|
|
18158
|
-
"signature": "export declare const VERSION: \"3.
|
|
18158
|
+
"signature": "export declare const VERSION: \"3.3.0\";",
|
|
18159
18159
|
"doc": "/**\n * Current package version. A hardcoded literal on purpose - core runs on the edge (no fs), so it can't\n * read its own package.json at runtime. `scripts/version.ts` rewrites it on every release bump and\n * `check:publish` asserts it equals `@nifrajs/core`'s package version.\n */"
|
|
18160
18160
|
},
|
|
18161
18161
|
{
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nifrajs/cli",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.0",
|
|
4
4
|
"description": "The nifra CLI - zero-config dev/build/start for a nifra app (`nifra dev`, `nifra build`, `nifra start`).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bun",
|
|
@@ -66,14 +66,14 @@
|
|
|
66
66
|
"access": "public"
|
|
67
67
|
},
|
|
68
68
|
"dependencies": {
|
|
69
|
-
"@nifrajs/client": "3.
|
|
70
|
-
"@nifrajs/core": "3.
|
|
71
|
-
"@nifrajs/mcp": "3.
|
|
72
|
-
"@nifrajs/runner": "3.
|
|
73
|
-
"@nifrajs/schema": "3.
|
|
74
|
-
"@nifrajs/testing": "3.
|
|
75
|
-
"@nifrajs/web": "3.
|
|
76
|
-
"create-nifra": "3.
|
|
69
|
+
"@nifrajs/client": "3.3.0",
|
|
70
|
+
"@nifrajs/core": "3.3.0",
|
|
71
|
+
"@nifrajs/mcp": "3.3.0",
|
|
72
|
+
"@nifrajs/runner": "3.3.0",
|
|
73
|
+
"@nifrajs/schema": "3.3.0",
|
|
74
|
+
"@nifrajs/testing": "3.3.0",
|
|
75
|
+
"@nifrajs/web": "3.3.0",
|
|
76
|
+
"create-nifra": "3.3.0"
|
|
77
77
|
},
|
|
78
78
|
"repository": {
|
|
79
79
|
"type": "git",
|
package/src/cli.ts
CHANGED
|
@@ -216,7 +216,7 @@ set in the process environment is never overwritten by a file.
|
|
|
216
216
|
${renderCommandCatalogHelp()}`
|
|
217
217
|
|
|
218
218
|
// Kept in lockstep with packages/cli/package.json by check:publish's version-consistency gate.
|
|
219
|
-
const CLI_VERSION = "3.
|
|
219
|
+
const CLI_VERSION = "3.3.0"
|
|
220
220
|
|
|
221
221
|
// A render adapter + nifra server are opaque to the CLI (it just forwards them); cast at the seam.
|
|
222
222
|
const asAdapter = (v: unknown): RenderAdapter => v as RenderAdapter
|
package/src/mcp-http.ts
CHANGED
|
@@ -29,7 +29,7 @@ export { docsTools } from "./mcp-docs-tools.ts"
|
|
|
29
29
|
export type { TypeEntry } from "./types-search.ts"
|
|
30
30
|
|
|
31
31
|
// Kept in lockstep with packages/cli/package.json by check:publish's version-consistency gate.
|
|
32
|
-
const VERSION = "3.
|
|
32
|
+
const VERSION = "3.3.0"
|
|
33
33
|
const SERVER_INFO = { name: "nifra-docs", version: VERSION }
|
|
34
34
|
// Derive the GET/health tool list from the tools actually served, so the line can never drift from them.
|
|
35
35
|
const docsHealth = (tools: McpTool[]): string =>
|