pi-openai-toolkit 0.14.2 → 0.14.4
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/README.md +239 -246
- package/README.zh.md +243 -246
- package/docs/internals.md +73 -0
- package/extensions/auto-mode.ts +1 -1
- package/extensions/codex-astra.ts +1 -1
- package/extensions/compaction.ts +1 -1
- package/extensions/image-generation.ts +1 -1
- package/extensions/web-search.ts +1 -1
- package/package.json +2 -1
- package/src/config.ts +10 -0
- package/src/context-management/codex-provider.ts +12 -14
- package/src/context-management/history-notes.ts +8 -2
- package/src/context-management/tools.ts +5 -3
- package/src/context-management/types.ts +2 -1
- package/src/context-management/window-manager.ts +479 -421
- package/src/extension-runtime.ts +9 -5
- package/src/types.ts +7 -0
- package/src/web-search/prompt.ts +1 -1
package/README.md
CHANGED
|
@@ -1,246 +1,239 @@
|
|
|
1
|
-
# pi-openai-toolkit
|
|
2
|
-
|
|
3
|
-
[](https://www.npmjs.com/package/pi-openai-toolkit)
|
|
4
|
-
[](./LICENSE)
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
| Key | Type / default | Meaning |
|
|
149
|
-
| --- | --- | --- |
|
|
150
|
-
| `enabled` | *boolean*, `
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
|
155
|
-
|
|
|
156
|
-
| `enabled` | *boolean*, `true` |
|
|
157
|
-
| `
|
|
158
|
-
| `
|
|
159
|
-
| `
|
|
160
|
-
| `
|
|
161
|
-
| `
|
|
162
|
-
| `
|
|
163
|
-
| `
|
|
164
|
-
| `
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
## Contributing
|
|
241
|
-
|
|
242
|
-
Issues and pull requests are welcome at the [issue tracker](https://github.com/awoaCrim/pi-openai-toolkit/issues). For behavior-changing work, open an issue first so protocol assumptions (especially alpha `history`/`notes` contracts) can be discussed. Run `bun test` and `npm run typecheck` before submitting; new wire-protocol behavior needs fixture-based tests.
|
|
243
|
-
|
|
244
|
-
## License
|
|
245
|
-
|
|
246
|
-
MIT © awoaCrim and contributors. See [LICENSE](./LICENSE) and the third-party attribution in [NOTICE](./NOTICE).
|
|
1
|
+
# pi-openai-toolkit
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/pi-openai-toolkit)
|
|
4
|
+
[](./LICENSE)
|
|
5
|
+
[简体中文](./README.zh.md)
|
|
6
|
+
|
|
7
|
+
OpenAI toolkit for Pi: lossless long-session context management, hosted web search, image generation, and approval-gated auto mode.
|
|
8
|
+
|
|
9
|
+
Pi's built-in compaction summarizes older turns into text, permanently losing detail. The OpenAI Codex backend solves this with mechanisms generic clients never received: a context-window system (`new_context`, `history`, `notes`), encrypted lossless compaction, and hosted tools. This package ports those Codex capabilities into Pi by implementing their protocols against the live backends; Auto Mode is its own feature. One note: the context-window tools you see in a covered session are Codex's mechanism, surfaced by this toolkit, not something Pi or this package invented independently.
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- **Context windows** (Codex mechanism, ported) - roll over to a fresh window with `new_context`; nothing is re-summarized
|
|
14
|
+
- **Cross-window recall** - search and read earlier windows with `history`
|
|
15
|
+
- **Working-memory notes** - persistent checkpoint files with `notes`, gating every rollover
|
|
16
|
+
- **Encrypted compaction (v2)** - OpenAI backend compaction capability, surfaced for Responses models
|
|
17
|
+
- **Hosted web search** - OpenAI Responses native `web_search`, swapped in for Pi's local tool on listed models
|
|
18
|
+
- **Image generation** - hosted `image_generation` (gpt-image-2) wrapped in a Pi tool that keeps image bytes out of history
|
|
19
|
+
- **Auto mode** - this package's own feature: a reviewer-model approval gate for side-effecting tool calls
|
|
20
|
+
- **Safety guarantees** - no lossy summary on covered models, credentials never leave the machine
|
|
21
|
+
|
|
22
|
+
Requires Pi >= 0.85.1 and Node.js >= 22.19.0. The toolkit registers no provider or model of its own; it works entirely through Pi's existing catalog, auth, and session storage. Do not run `pi-remote-compact`, `@lll9p/pi-better-compaction`, or a standalone `pi-openai-web-search` alongside it: duplicate hooks cause race conditions.
|
|
23
|
+
|
|
24
|
+
## Install
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
pi install npm:pi-openai-toolkit
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Per-project install:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pi install npm:pi-openai-toolkit --local
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Install from git for development or pinned builds:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
pi install git:github.com/awoaCrim/pi-openai-toolkit
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Update later with `pi update --extensions`.
|
|
43
|
+
|
|
44
|
+
## Quick start
|
|
45
|
+
|
|
46
|
+
**1.** Create `~/.pi/agent/extensions/pi-openai-toolkit/config.json` (Windows: `C:\Users\<user>\.pi\agent\extensions\pi-openai-toolkit\config.json`):
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"compaction": {
|
|
51
|
+
"contextManagement": "remote",
|
|
52
|
+
"contextReminderThresholdPercent": 10
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**2.** Start Pi on a covered model: any session on Pi's built-in Codex provider (`openai-codex`), or a gateway model listed in `gatewayContextModels`:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
pi --model uwoacrimson/gpt-6-astra
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**3.** Confirm activation: the four Codex context tools (`new_context`, `get_context_remaining`, `history`, `notes`) appear in the session.
|
|
64
|
+
|
|
65
|
+
When the window drops below the reminder threshold, the model gets one nudge to save notes and roll over. Everything earlier stays searchable through `history`. With no config file, Pi's defaults apply and every optional feature stays off.
|
|
66
|
+
|
|
67
|
+
Gateway coverage is an explicit allowlist: `compaction.gatewayContextModels` holds exact `provider/model` keys, each on the `openai-responses` wire and actually relayed by your gateway with Codex window markers intact. If your gateway isn't configured in Pi yet, add it to `~/.pi/agent/models.json`:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"providers": {
|
|
72
|
+
"uwoacrimson": {
|
|
73
|
+
"baseUrl": "https://<your-gateway>/v1",
|
|
74
|
+
"apiKeyRef": "uwoacrimson",
|
|
75
|
+
"api": "openai",
|
|
76
|
+
"models": [{
|
|
77
|
+
"id": "gpt-6-astra",
|
|
78
|
+
"name": "GPT-6 Astra",
|
|
79
|
+
"api": "openai-responses",
|
|
80
|
+
"reasoning": true,
|
|
81
|
+
"input": ["text"],
|
|
82
|
+
"contextWindow": 272000,
|
|
83
|
+
"maxTokens": 16384,
|
|
84
|
+
"compat": {"thinkingLevelMap": {"off": 0, "minimal": 0.1, "low": 0.2, "medium": 0.5, "high": 1, "xhigh": 2, "max": 2}}
|
|
85
|
+
}]
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Usage
|
|
92
|
+
|
|
93
|
+
### Codex Remote Context
|
|
94
|
+
|
|
95
|
+
This is Codex's own context-window mechanism, implemented for Pi by this toolkit. Covered sessions run like they do in the Codex client: the model works in context windows, checkpoints state into `notes`, and calls `new_context` before the window fills. Nothing is summarized; earlier windows remain fully readable through `history`. A rollover is refused unless a notes checkpoint succeeded in the current window, and the session survives resume and fork with the same rules. Reminder and exhausted-window messages only advise the model; every rollover is the model's own tool call.
|
|
96
|
+
|
|
97
|
+
The toolkit owns compaction for covered models: Pi-native compaction is cancelled on every path, so no lossy summary can enter the session. If Remote Context cannot activate, the exact reason is reported as a notification.
|
|
98
|
+
|
|
99
|
+
Lifecycle mechanics and protocol contracts: [docs/internals.md](docs/internals.md#rollover-lifecycle).
|
|
100
|
+
|
|
101
|
+
### Remote Compaction v2
|
|
102
|
+
|
|
103
|
+
For other Responses models: when compaction triggers, the toolkit asks the OpenAI backend's compaction capability for an encrypted checkpoint of the old prefix instead of allowing a text summary to replace it; the server computes the checkpoint, the client only stores and replays it. Later requests replay the checkpoint ahead of recent turns. Failed attempts degrade to Pi's native compaction (`nativeFallback`). Wire contract: [docs/internals.md](docs/internals.md#remote-compaction-v2-wire-contract).
|
|
104
|
+
|
|
105
|
+
### Web search
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"webSearch": { "enabled": true, "models": ["uwoacrimson/gpt-5.6-luna"] }
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Listed models get OpenAI's hosted `web_search`; their local `web_search` tool is removed from the payload. The live model connection is reused, no extra key.
|
|
114
|
+
|
|
115
|
+
### Image generation
|
|
116
|
+
|
|
117
|
+
```json
|
|
118
|
+
{
|
|
119
|
+
"imageGeneration": { "enabled": true }
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Adds `openai_generate_image` to every Responses-wire session, wrapping OpenAI's hosted `image_generation` tool (`gpt-image-2`): text-to-image and edits from explicitly passed local reference files. The wrapper stores image bytes as artifacts instead of session history. Each successful request may incur a charge, hence the default off.
|
|
124
|
+
|
|
125
|
+
### Auto mode
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{
|
|
129
|
+
"autoMode": {
|
|
130
|
+
"enabled": true,
|
|
131
|
+
"models": ["uwoacrimson/gpt-5.6-luna"],
|
|
132
|
+
"reviewerModel": "uwoacrimson/gpt-5.6-luna"
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Engage per session with `/auto on`. Side-effecting tool calls are approved by `reviewerModel` (intrinsic risk plus conversation authorization) instead of blocking on the user. The reviewer has read-only tools only, a timeout is never approval, and headless sessions block instead of guessing. Decisions are persisted for audit.
|
|
138
|
+
|
|
139
|
+
## Configuration
|
|
140
|
+
|
|
141
|
+
One JSON file at `~/.pi/agent/extensions/pi-openai-toolkit/config.json`. Every key is optional; unknown keys are ignored with a warning. `models` keys are exact `provider/model-id` allowlists (no globbing); each feature stays off until a model is listed.
|
|
142
|
+
|
|
143
|
+
<details>
|
|
144
|
+
<summary><b>Full option reference</b> (compaction, webSearch, imageGeneration, autoMode)</summary>
|
|
145
|
+
|
|
146
|
+
### `compaction`
|
|
147
|
+
|
|
148
|
+
| Key | Type / default | Meaning |
|
|
149
|
+
| --- | --- | --- |
|
|
150
|
+
| `enabled` | *boolean*, `true` | Master switch for the compaction extension. |
|
|
151
|
+
| `contextManagement` | `"off"` \| `"remote"`, `"off"` | Enables Codex Remote Context for covered models: any `openai-codex` session on the `openai-codex-responses` API, plus gateway models listed below. |
|
|
152
|
+
| `gatewayContextModels` | *string[]*, `[]` | Exact `provider/model` keys allowed to use Codex Remote Context over the `openai-responses` gateway wire. Coverage is operator-configured; the native Codex route ignores this list. |
|
|
153
|
+
| `contextReminderThresholdPercent` | *integer* `0`-`100`, `5` | Percentage of the usable budget (context window minus a fixed 16384-token output reserve) below which the once-per-window checkpoint reminder fires. `0` suppresses the reminder and, in the current implementation, the exhausted-window fallback too; keep it above 0. The threshold measures the toolkit's budget, a fixed pairing with Pi's native reserve rather than a live sync. |
|
|
154
|
+
| `allowCompactionContinuityBreak` | *boolean*, `false` | v2: rebuild a fresh encrypted chain when the latest compaction came from another strategy (e.g. a pre-install text summary). |
|
|
155
|
+
| `remoteCompactModel` | *string \| null*, `null` | v2: model for the server-side compaction request only; the session model never switches. Must resolve to the same base URL as the active model. |
|
|
156
|
+
| `nativeFallback.enabled` | *boolean*, `true` | Native compaction fallback, only after a remote attempt actually failed. |
|
|
157
|
+
| `nativeFallback.model` | *string \| null*, `null` | Summary model for models that cannot use v2 at all. `null` keeps the active model. |
|
|
158
|
+
| `nativeFallback.thinkingLevel` | *string*, `"off"` | Thinking level for the fallback summary (`off`...`max`). |
|
|
159
|
+
| `responsesApis` | *string[]*, both APIs | Which Responses API identifiers may use v2 compaction. v2 only applies to models that Remote Context does not cover. |
|
|
160
|
+
| `notifyOnLoad` | *boolean*, `false` | Startup banner. |
|
|
161
|
+
| `debug` | *boolean*, `false` | Write lifecycle and compaction artifacts under `artifactRoot`, including the activation reason per `session_start`. |
|
|
162
|
+
| `logProviderPayloads` / `logCompactResponses` | *boolean*, `false` | Also write raw provider payloads and SSE bodies. Off unless debugging one request. |
|
|
163
|
+
| `redactSensitiveData` | *boolean*, `true` | Artifact redaction; credentials, account ids, and encrypted payloads are always redacted. |
|
|
164
|
+
| `artifactRoot` | *string*, `~/.pi/agent/artifacts/pi-openai-toolkit/compaction` | Artifact root; relative paths resolve against the config directory. |
|
|
165
|
+
|
|
166
|
+
### `webSearch`
|
|
167
|
+
|
|
168
|
+
| Key | Type / default | Meaning |
|
|
169
|
+
| --- | --- | --- |
|
|
170
|
+
| `enabled` | *boolean*, `true` | Master switch. |
|
|
171
|
+
| `models` | *string[]*, `[]` | Sessions receiving OpenAI's hosted `web_search`: the local `web_search` tool is removed and the native responses-API tool injected. |
|
|
172
|
+
|
|
173
|
+
### `imageGeneration`
|
|
174
|
+
|
|
175
|
+
| Key | Type / default | Meaning |
|
|
176
|
+
| --- | --- | --- |
|
|
177
|
+
| `enabled` | *boolean*, `false` | Exposes `openai_generate_image` to all Responses-wire sessions. No model allowlist by design. |
|
|
178
|
+
|
|
179
|
+
### `autoMode`
|
|
180
|
+
|
|
181
|
+
| Key | Type / default | Meaning |
|
|
182
|
+
| --- | --- | --- |
|
|
183
|
+
| `enabled` | *boolean*, `true` | Master switch; engaging still needs a listed model and `reviewerModel`. |
|
|
184
|
+
| `models` | *string[]*, `[]` | Session models allowed to run auto mode. |
|
|
185
|
+
| `reviewerModel` | *string \| null*, `null` | Approving model for one-off reviews; never becomes the conversation model. |
|
|
186
|
+
| `gate` | `"side-effect"` \| `"all"`, `"side-effect"` | Review scope; `/auto all` switches per session. |
|
|
187
|
+
| `extraTools` | *string[]*, `[]` | Additional reviewed tools beyond `bash`, `write`, `edit`. |
|
|
188
|
+
| `timeoutMs` | *integer* 1000-120000, `30000` | Review deadline. Expiry is never approval. |
|
|
189
|
+
| `transcript` | *boolean*, `true` | Bounded conversation view so the reviewer can judge authorization. |
|
|
190
|
+
| `evidenceTools` | *boolean*, `true` | Reviewer may use `read`, `grep`, `find`, `ls`. Never `bash`, writes, or network. |
|
|
191
|
+
| `maxEvidenceRounds` | *integer* 0-8, `3` | Investigation rounds before the verdict; `0` is a single completion. |
|
|
192
|
+
| `classifier.*` | *object* | Optional non-blocking low-risk pre-scorer. Fast-path only, never denies. |
|
|
193
|
+
| `circuitBreaker.*` | *object* | End the turn after repeated denials (`consecutiveDenials` `3`, or `recentDenials` `10` within `windowSize` `50`; `0` disables). |
|
|
194
|
+
|
|
195
|
+
### `codexAstra`
|
|
196
|
+
|
|
197
|
+
Removed section. The Astra compatibility layer activates silently for any `gpt-6-astra` session on a Responses-family API; old `codexAstra` config sections are ignored with a warning. If another host (e.g. Oh My Pi) implements the same rewrite, enable only one.
|
|
198
|
+
|
|
199
|
+
</details>
|
|
200
|
+
|
|
201
|
+
## Security
|
|
202
|
+
|
|
203
|
+
- On covered models, every Pi-native compaction path (threshold, manual `/compact`, overflow) is cancelled while Remote Context owns the session; no lossy summary is possible.
|
|
204
|
+
- Gateway mode forwards only the configured data-plane API key. OAuth tokens, account cookies, and account ids are never sent to a gateway and are always redacted from artifacts.
|
|
205
|
+
- `new_context` cannot discard unsaved state: a successful notes checkpoint (or explicit user `force`) is required.
|
|
206
|
+
- Image generation (billed) and Auto Mode are opt-in; Auto Mode fails closed where nobody can approve.
|
|
207
|
+
|
|
208
|
+
For host-level insurance, set `"compaction": { "enabled": false }` in Pi's `settings.json`.
|
|
209
|
+
|
|
210
|
+
## Development
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
npm run typecheck # tsc project check
|
|
214
|
+
bun test # unit suite
|
|
215
|
+
npm run test:pi # Pi integration smoke tests
|
|
216
|
+
npm pack --dry-run # inspect the published archive
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Documentation
|
|
220
|
+
|
|
221
|
+
- [docs/internals.md](docs/internals.md) - protocol endpoints, rollover lifecycle, v2 wire contract, artifacts, provenance
|
|
222
|
+
- [README.zh.md](README.zh.md) - 简体中文
|
|
223
|
+
- [NOTICE](./NOTICE) - third-party attribution
|
|
224
|
+
|
|
225
|
+
## Contributing
|
|
226
|
+
|
|
227
|
+
Issues and pull requests are welcome at the [issue tracker](https://github.com/awoaCrim/pi-openai-toolkit/issues). Open an issue before behavior-changing work so protocol assumptions can be discussed. Run `bun test` and `npm run typecheck` before submitting; new wire behavior needs fixture-based tests.
|
|
228
|
+
|
|
229
|
+
## Maintainers
|
|
230
|
+
|
|
231
|
+
[awoaCrim](https://github.com/awoaCrim)
|
|
232
|
+
|
|
233
|
+
## License
|
|
234
|
+
|
|
235
|
+
MIT © awoaCrim and contributors. See [LICENSE](./LICENSE) and [NOTICE](./NOTICE).
|
|
236
|
+
|
|
237
|
+
## Thanks
|
|
238
|
+
|
|
239
|
+
Thanks to the [Linux.do](https://linux.do/) community for the support and discussions.
|