@theokit/tauri 0.1.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/CHANGELOG.md +11 -0
- package/README.md +56 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/sidecar.d.ts +21 -0
- package/dist/sidecar.js +23 -0
- package/dist/sidecar.js.map +1 -0
- package/package.json +45 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Changelog — @theokit/tauri
|
|
2
|
+
|
|
3
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this package adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
4
|
+
|
|
5
|
+
## [0.1.0] - 2026-07-12
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- Initial release — desktop transport glue for TheoKit agents (ADR-0055).
|
|
9
|
+
- **Webview** (`@theokit/tauri`): `createTauriChannelSource(core, { runCommand?, approveCommand? })` bridges an injected Tauri `{ invoke, Channel }` into a `ChannelPushSource` (the M42 `ChannelTransport` push contract) — JSONL `Channel` events (possibly multi-line) become `onLine`, the `run_turn` invoke resolves to `onClose` / rejects to `onError` (never swallowed, Rule 8), and `settle` routes a HITL decision to the `approve` command. `createTauriAgentClient(core, options?)` is the no-React convenience over M44 `createAgentClient`.
|
|
10
|
+
- **Node sidecar** (`@theokit/tauri/sidecar`): `runTurnToJsonl(mod, apiKey, message, write, awaitApproval?)` streams one agent turn via `streamAgentTurnInProcess` and writes each `UIMessageChunk` as a JSONL line; a thrown error is emitted as a trailing `{type:'error'}` line.
|
|
11
|
+
- `@tauri-apps/api` is an **optional** peer dependency — its primitives are injected structurally, so framework core `theokit` stays Tauri-agnostic (ADR-0045).
|
package/README.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# @theokit/tauri
|
|
2
|
+
|
|
3
|
+
Ship your TheoKit agent as a desktop app. One call wires the Tauri shell to your agent — you write the UI, not the bridge.
|
|
4
|
+
|
|
5
|
+
A [Tauri](https://tauri.app) app is a Rust shell around a system webview. `@theokit/tauri` connects the two halves to a TheoKit agent:
|
|
6
|
+
|
|
7
|
+
- **In the webview** — your agent streams into React with the same `useAgent` hook you already use on the web, rendered with [`@theokit/ui`](https://www.npmjs.com/package/@theokit/ui).
|
|
8
|
+
- **In the Node sidecar** — one helper runs a turn and streams it out as newline-delimited JSON for the Rust shell to forward.
|
|
9
|
+
|
|
10
|
+
Framework core (`theokit`) never learns about Tauri — the Tauri primitives are handed in, so this package is an opt-in add-on, not a dependency of the framework.
|
|
11
|
+
|
|
12
|
+
## Install
|
|
13
|
+
|
|
14
|
+
```sh
|
|
15
|
+
npm add @theokit/tauri
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
`theokit` is a peer dependency; `@tauri-apps/api` is an **optional** peer (only needed in the webview half).
|
|
19
|
+
|
|
20
|
+
## Webview — drive the UI with `useAgent`
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import { Channel, invoke } from '@tauri-apps/api/core'
|
|
24
|
+
import { ChannelTransport } from 'theokit/client'
|
|
25
|
+
import { createTauriChannelSource } from '@theokit/tauri'
|
|
26
|
+
|
|
27
|
+
const transport = new ChannelTransport({
|
|
28
|
+
source: createTauriChannelSource({ invoke, Channel }),
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
// then, in a component:
|
|
32
|
+
const agent = useAgent(transport)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
No React? `createTauriAgentClient({ invoke, Channel })` returns the same handle over the standalone client.
|
|
36
|
+
|
|
37
|
+
The Rust side exposes two commands (names configurable via `{ runCommand, approveCommand }`, default `run_turn` / `approve`) that talk to the sidecar.
|
|
38
|
+
|
|
39
|
+
## Node sidecar — stream one turn as JSONL
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
import { runTurnToJsonl } from '@theokit/tauri/sidecar'
|
|
43
|
+
import * as chatAgent from './agents/chat.js'
|
|
44
|
+
|
|
45
|
+
await runTurnToJsonl(chatAgent, process.env.OPENROUTER_API_KEY!, message, (line) => process.stdout.write(line))
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Each line is one `UIMessageChunk`; a failed turn ends with a `{"type":"error"}` line — errors are surfaced, never swallowed.
|
|
49
|
+
|
|
50
|
+
## Scaffold it
|
|
51
|
+
|
|
52
|
+
`npm create theokit@latest my-app -- --surface desktop` generates a complete Tauri app already wired to this package.
|
|
53
|
+
|
|
54
|
+
## License
|
|
55
|
+
|
|
56
|
+
Apache-2.0
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { CreateAgentClientOptions, AgentClientHandle, ChannelPushSource } from 'theokit/client/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* `@theokit/tauri` (ADR-0055) — the desktop transport glue for TheoKit agents.
|
|
5
|
+
*
|
|
6
|
+
* The webview consumes the agent via the unified client (`ChannelTransport` M42 + `createAgentClient` M44 /
|
|
7
|
+
* `useAgent` M41). This module turns the Tauri `Channel`/`invoke` push into a `ChannelPushSource` so the
|
|
8
|
+
* webview app writes one call instead of hand-rolling the bridge. The UI is `@theokit/ui` (the webview is a
|
|
9
|
+
* browser); the runtime is `@theokit/sdk` (in the sidecar — see `@theokit/tauri/sidecar`). Core `theokit`
|
|
10
|
+
* stays Tauri-agnostic — the `@tauri-apps/api` primitives are INJECTED here (ADR-0055 D3), never a hard dep.
|
|
11
|
+
*/
|
|
12
|
+
/** A Tauri `Channel<string>` — structurally matches `@tauri-apps/api/core`'s `Channel` (no hard dep). */
|
|
13
|
+
interface TauriChannel {
|
|
14
|
+
onmessage: (line: string) => void;
|
|
15
|
+
}
|
|
16
|
+
/** The Tauri `core` primitives injected into the source (structurally matches `@tauri-apps/api/core`). */
|
|
17
|
+
interface TauriCore {
|
|
18
|
+
invoke: (cmd: string, args?: Record<string, unknown>) => Promise<unknown>;
|
|
19
|
+
Channel: new () => TauriChannel;
|
|
20
|
+
}
|
|
21
|
+
interface TauriChannelSourceOptions {
|
|
22
|
+
/** The Rust `#[tauri::command]` that runs one agent turn (default `run_turn`, matching the M45 scaffold). */
|
|
23
|
+
runCommand?: string;
|
|
24
|
+
/** The Rust `#[tauri::command]` that settles a HITL approval (default `approve`). */
|
|
25
|
+
approveCommand?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Build a {@link ChannelPushSource} bridging a Tauri `run_turn` `Channel` + `approve` `invoke` (ADR-0045 D3).
|
|
29
|
+
* Pass it to `new ChannelTransport({ source })` (M42) and drive it with `useAgent(transport)` (React webview)
|
|
30
|
+
* or `createAgentClient(transport)` (see {@link createTauriAgentClient}).
|
|
31
|
+
*/
|
|
32
|
+
declare function createTauriChannelSource(core: TauriCore, options?: TauriChannelSourceOptions): ChannelPushSource;
|
|
33
|
+
/**
|
|
34
|
+
* Convenience: a standalone (no-React) agent client wired to the Tauri desktop transport. Equivalent to
|
|
35
|
+
* `createAgentClient(new ChannelTransport({ source: createTauriChannelSource(core, opts) }), { context })`.
|
|
36
|
+
* A React webview should instead use `useAgent(new ChannelTransport({ source: createTauriChannelSource(core) }))`
|
|
37
|
+
* from `theokit/client` (so it can render with `@theokit/ui`).
|
|
38
|
+
*/
|
|
39
|
+
declare function createTauriAgentClient<TInput = unknown>(core: TauriCore, options?: TauriChannelSourceOptions & CreateAgentClientOptions): AgentClientHandle<TInput>;
|
|
40
|
+
|
|
41
|
+
export { type TauriChannel, type TauriChannelSourceOptions, type TauriCore, createTauriAgentClient, createTauriChannelSource };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import {
|
|
3
|
+
ChannelTransport,
|
|
4
|
+
createAgentClient
|
|
5
|
+
} from "theokit/client/core";
|
|
6
|
+
function createTauriChannelSource(core, options = {}) {
|
|
7
|
+
const runCommand = options.runCommand ?? "run_turn";
|
|
8
|
+
const approveCommand = options.approveCommand ?? "approve";
|
|
9
|
+
return {
|
|
10
|
+
start(turn, { onLine, onClose, onError }) {
|
|
11
|
+
const channel = new core.Channel();
|
|
12
|
+
channel.onmessage = (line) => {
|
|
13
|
+
for (const part of line.split("\n")) {
|
|
14
|
+
const trimmed = part.trim();
|
|
15
|
+
if (trimmed) onLine(trimmed);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
void core.invoke(runCommand, { message: turn.message, context: turn.context, onChunk: channel }).then(onClose, (err) => {
|
|
19
|
+
onError?.(err instanceof Error ? err : new Error(String(err)));
|
|
20
|
+
});
|
|
21
|
+
return () => void 0;
|
|
22
|
+
},
|
|
23
|
+
settle: async (approvalId, decision) => {
|
|
24
|
+
await core.invoke(approveCommand, { approvalId, approved: decision.approved });
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function createTauriAgentClient(core, options = {}) {
|
|
29
|
+
const { runCommand, approveCommand, ...clientOptions } = options;
|
|
30
|
+
const source = createTauriChannelSource(core, { runCommand, approveCommand });
|
|
31
|
+
return createAgentClient(new ChannelTransport({ source }), clientOptions);
|
|
32
|
+
}
|
|
33
|
+
export {
|
|
34
|
+
createTauriAgentClient,
|
|
35
|
+
createTauriChannelSource
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n ChannelTransport,\n createAgentClient,\n type AgentClientHandle,\n type ApprovalDecision,\n type ChannelPushSource,\n type CreateAgentClientOptions,\n} from 'theokit/client/core'\n\n/**\n * `@theokit/tauri` (ADR-0055) — the desktop transport glue for TheoKit agents.\n *\n * The webview consumes the agent via the unified client (`ChannelTransport` M42 + `createAgentClient` M44 /\n * `useAgent` M41). This module turns the Tauri `Channel`/`invoke` push into a `ChannelPushSource` so the\n * webview app writes one call instead of hand-rolling the bridge. The UI is `@theokit/ui` (the webview is a\n * browser); the runtime is `@theokit/sdk` (in the sidecar — see `@theokit/tauri/sidecar`). Core `theokit`\n * stays Tauri-agnostic — the `@tauri-apps/api` primitives are INJECTED here (ADR-0055 D3), never a hard dep.\n */\n\n/** A Tauri `Channel<string>` — structurally matches `@tauri-apps/api/core`'s `Channel` (no hard dep). */\nexport interface TauriChannel {\n onmessage: (line: string) => void\n}\n\n/** The Tauri `core` primitives injected into the source (structurally matches `@tauri-apps/api/core`). */\nexport interface TauriCore {\n invoke: (cmd: string, args?: Record<string, unknown>) => Promise<unknown>\n Channel: new () => TauriChannel\n}\n\nexport interface TauriChannelSourceOptions {\n /** The Rust `#[tauri::command]` that runs one agent turn (default `run_turn`, matching the M45 scaffold). */\n runCommand?: string\n /** The Rust `#[tauri::command]` that settles a HITL approval (default `approve`). */\n approveCommand?: string\n}\n\n/**\n * Build a {@link ChannelPushSource} bridging a Tauri `run_turn` `Channel` + `approve` `invoke` (ADR-0045 D3).\n * Pass it to `new ChannelTransport({ source })` (M42) and drive it with `useAgent(transport)` (React webview)\n * or `createAgentClient(transport)` (see {@link createTauriAgentClient}).\n */\nexport function createTauriChannelSource(\n core: TauriCore,\n options: TauriChannelSourceOptions = {},\n): ChannelPushSource {\n const runCommand = options.runCommand ?? 'run_turn'\n const approveCommand = options.approveCommand ?? 'approve'\n\n return {\n start(turn, { onLine, onClose, onError }) {\n const channel = new core.Channel()\n channel.onmessage = (line: string) => {\n // A Stdout event may carry multiple newline-delimited JSON lines (ADR-0045 D2).\n for (const part of line.split('\\n')) {\n const trimmed = part.trim()\n if (trimmed) onLine(trimmed)\n }\n }\n // Forward the M43 per-request context alongside the message — the sidecar receives it via the Rust\n // command args (the ChannelPushSource contract obliges the invoke to carry `turn.context`, not drop it).\n void core\n .invoke(runCommand, { message: turn.message, context: turn.context, onChunk: channel })\n .then(onClose, (err: unknown) => {\n // A Tauri command rejection is a real error — surface it, never swallow it (Rule 8 / M45 review LOW).\n onError?.(err instanceof Error ? err : new Error(String(err)))\n })\n // The Rust shell kills the prior sidecar on the next run, so no explicit abort is needed.\n return () => undefined\n },\n settle: async (approvalId: string, decision: ApprovalDecision) => {\n await core.invoke(approveCommand, { approvalId, approved: decision.approved })\n },\n }\n}\n\n/**\n * Convenience: a standalone (no-React) agent client wired to the Tauri desktop transport. Equivalent to\n * `createAgentClient(new ChannelTransport({ source: createTauriChannelSource(core, opts) }), { context })`.\n * A React webview should instead use `useAgent(new ChannelTransport({ source: createTauriChannelSource(core) }))`\n * from `theokit/client` (so it can render with `@theokit/ui`).\n */\nexport function createTauriAgentClient<TInput = unknown>(\n core: TauriCore,\n options: TauriChannelSourceOptions & CreateAgentClientOptions = {},\n): AgentClientHandle<TInput> {\n const { runCommand, approveCommand, ...clientOptions } = options\n const source = createTauriChannelSource(core, { runCommand, approveCommand })\n return createAgentClient<TInput>(new ChannelTransport({ source }), clientOptions)\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAKK;AAmCA,SAAS,yBACd,MACA,UAAqC,CAAC,GACnB;AACnB,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,iBAAiB,QAAQ,kBAAkB;AAEjD,SAAO;AAAA,IACL,MAAM,MAAM,EAAE,QAAQ,SAAS,QAAQ,GAAG;AACxC,YAAM,UAAU,IAAI,KAAK,QAAQ;AACjC,cAAQ,YAAY,CAAC,SAAiB;AAEpC,mBAAW,QAAQ,KAAK,MAAM,IAAI,GAAG;AACnC,gBAAM,UAAU,KAAK,KAAK;AAC1B,cAAI,QAAS,QAAO,OAAO;AAAA,QAC7B;AAAA,MACF;AAGA,WAAK,KACF,OAAO,YAAY,EAAE,SAAS,KAAK,SAAS,SAAS,KAAK,SAAS,SAAS,QAAQ,CAAC,EACrF,KAAK,SAAS,CAAC,QAAiB;AAE/B,kBAAU,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA,MAC/D,CAAC;AAEH,aAAO,MAAM;AAAA,IACf;AAAA,IACA,QAAQ,OAAO,YAAoB,aAA+B;AAChE,YAAM,KAAK,OAAO,gBAAgB,EAAE,YAAY,UAAU,SAAS,SAAS,CAAC;AAAA,IAC/E;AAAA,EACF;AACF;AAQO,SAAS,uBACd,MACA,UAAgE,CAAC,GACtC;AAC3B,QAAM,EAAE,YAAY,gBAAgB,GAAG,cAAc,IAAI;AACzD,QAAM,SAAS,yBAAyB,MAAM,EAAE,YAAY,eAAe,CAAC;AAC5E,SAAO,kBAA0B,IAAI,iBAAiB,EAAE,OAAO,CAAC,GAAG,aAAa;AAClF;","names":[]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { InProcessAwaitApproval } from 'theokit/server';
|
|
2
|
+
|
|
3
|
+
/** Writes one JSONL line (the sidecar's stdout `write`). */
|
|
4
|
+
type WriteLine = (line: string) => void;
|
|
5
|
+
/**
|
|
6
|
+
* Resolve one gated-tool approval inline (the Rust shell forwards the webview's decision over stdin).
|
|
7
|
+
* Aliases the seam's {@link InProcessAwaitApproval} so a sidecar can return the full `boolean | HitlDecision`
|
|
8
|
+
* the SDK supports — never a narrower shape (the desktop stdin protocol carries `approved` today, but the
|
|
9
|
+
* type stays forward-compatible with structured decisions).
|
|
10
|
+
*/
|
|
11
|
+
type SidecarAwaitApproval = InProcessAwaitApproval;
|
|
12
|
+
/**
|
|
13
|
+
* `@theokit/tauri/sidecar` (ADR-0055 D2) — the NODE side of the desktop app. Run ONE agent turn via the
|
|
14
|
+
* in-process seam (`streamAgentTurnInProcess`, M35/M36) and emit each `UIMessageChunk` as a single JSONL
|
|
15
|
+
* line to `write`; the Rust shell streams these to the webview over a Tauri `Channel`. A thrown error is
|
|
16
|
+
* surfaced as a trailing `{type:'error'}` line, never swallowed (Rule 8). HITL: a gated tool pauses; the
|
|
17
|
+
* caller resolves `awaitApproval` (typically after the Rust shell forwards the webview's decision on stdin).
|
|
18
|
+
*/
|
|
19
|
+
declare function runTurnToJsonl(mod: unknown, apiKey: string, message: string, write: WriteLine, awaitApproval?: SidecarAwaitApproval): Promise<void>;
|
|
20
|
+
|
|
21
|
+
export { type SidecarAwaitApproval, type WriteLine, runTurnToJsonl };
|
package/dist/sidecar.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// src/sidecar.ts
|
|
2
|
+
import { randomUUID } from "crypto";
|
|
3
|
+
import { streamAgentTurnInProcess } from "theokit/server";
|
|
4
|
+
async function runTurnToJsonl(mod, apiKey, message, write, awaitApproval) {
|
|
5
|
+
try {
|
|
6
|
+
for await (const chunk of streamAgentTurnInProcess(mod, apiKey, {
|
|
7
|
+
message,
|
|
8
|
+
sessionId: `desktop-${randomUUID()}`,
|
|
9
|
+
awaitApproval
|
|
10
|
+
})) {
|
|
11
|
+
write(`${JSON.stringify(chunk)}
|
|
12
|
+
`);
|
|
13
|
+
}
|
|
14
|
+
} catch (err) {
|
|
15
|
+
const errorText = err instanceof Error ? err.message : String(err);
|
|
16
|
+
write(`${JSON.stringify({ type: "error", errorText })}
|
|
17
|
+
`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
runTurnToJsonl
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=sidecar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sidecar.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto'\n\nimport { streamAgentTurnInProcess, type InProcessAwaitApproval } from 'theokit/server'\n\n/** Writes one JSONL line (the sidecar's stdout `write`). */\nexport type WriteLine = (line: string) => void\n\n/**\n * Resolve one gated-tool approval inline (the Rust shell forwards the webview's decision over stdin).\n * Aliases the seam's {@link InProcessAwaitApproval} so a sidecar can return the full `boolean | HitlDecision`\n * the SDK supports — never a narrower shape (the desktop stdin protocol carries `approved` today, but the\n * type stays forward-compatible with structured decisions).\n */\nexport type SidecarAwaitApproval = InProcessAwaitApproval\n\n/**\n * `@theokit/tauri/sidecar` (ADR-0055 D2) — the NODE side of the desktop app. Run ONE agent turn via the\n * in-process seam (`streamAgentTurnInProcess`, M35/M36) and emit each `UIMessageChunk` as a single JSONL\n * line to `write`; the Rust shell streams these to the webview over a Tauri `Channel`. A thrown error is\n * surfaced as a trailing `{type:'error'}` line, never swallowed (Rule 8). HITL: a gated tool pauses; the\n * caller resolves `awaitApproval` (typically after the Rust shell forwards the webview's decision on stdin).\n */\nexport async function runTurnToJsonl(\n mod: unknown,\n apiKey: string,\n message: string,\n write: WriteLine,\n awaitApproval?: SidecarAwaitApproval,\n): Promise<void> {\n try {\n for await (const chunk of streamAgentTurnInProcess(mod, apiKey, {\n message,\n sessionId: `desktop-${randomUUID()}`,\n awaitApproval,\n })) {\n write(`${JSON.stringify(chunk)}\\n`)\n }\n } catch (err) {\n const errorText = err instanceof Error ? err.message : String(err)\n write(`${JSON.stringify({ type: 'error', errorText })}\\n`)\n }\n}\n"],"mappings":";AAAA,SAAS,kBAAkB;AAE3B,SAAS,gCAA6D;AAoBtE,eAAsB,eACpB,KACA,QACA,SACA,OACA,eACe;AACf,MAAI;AACF,qBAAiB,SAAS,yBAAyB,KAAK,QAAQ;AAAA,MAC9D;AAAA,MACA,WAAW,WAAW,WAAW,CAAC;AAAA,MAClC;AAAA,IACF,CAAC,GAAG;AACF,YAAM,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA,CAAI;AAAA,IACpC;AAAA,EACF,SAAS,KAAK;AACZ,UAAM,YAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACjE,UAAM,GAAG,KAAK,UAAU,EAAE,MAAM,SAAS,UAAU,CAAC,CAAC;AAAA,CAAI;AAAA,EAC3D;AACF;","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@theokit/tauri",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Tauri desktop glue for TheoKit agents — the Channel/invoke transport source (webview) + the JSONL sidecar (node), over the unified client. UI is @theokit/ui; the runtime is @theokit/sdk.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./sidecar": {
|
|
14
|
+
"types": "./dist/sidecar.d.ts",
|
|
15
|
+
"import": "./dist/sidecar.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"CHANGELOG.md"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsup",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
26
|
+
},
|
|
27
|
+
"peerDependencies": {
|
|
28
|
+
"theokit": ">=0.30.0",
|
|
29
|
+
"@tauri-apps/api": ">=2.0.0"
|
|
30
|
+
},
|
|
31
|
+
"peerDependenciesMeta": {
|
|
32
|
+
"@tauri-apps/api": {
|
|
33
|
+
"optional": true
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"theokit": "workspace:*"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=22.12.0"
|
|
44
|
+
}
|
|
45
|
+
}
|