@odla-ai/cli 0.45.0 → 0.46.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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@odla-ai/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.46.0",
|
|
4
4
|
"description": "Agent-operable CLI for odla provisioning, calendar consent and connection lifecycle, System AI administration, Worker secrets, security jobs, and smoke checks.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://odla.ai/docs/packages/cli",
|
|
@@ -157,6 +157,67 @@ never asks for provider keys. The lower-level library flow remains available
|
|
|
157
157
|
for custom orchestrators; active reproduction still requires an explicitly
|
|
158
158
|
injected isolated executor and never falls back to the host shell.
|
|
159
159
|
|
|
160
|
+
## @odla-ai/chat — discussions humans and agents share
|
|
161
|
+
|
|
162
|
+
Messaging as a **schema + default-deny rules + injectable client** on odla-db —
|
|
163
|
+
no server to run, and no separate identity system: the same rule-governed graph
|
|
164
|
+
serves people and agents.
|
|
165
|
+
|
|
166
|
+
```ts
|
|
167
|
+
import { CHAT_RULES, createChatClient } from "@odla-ai/chat";
|
|
168
|
+
const chat = createChatClient(db, { selfId: myAuthId, selfEmail, displayName });
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
`botTrigger()` wakes an agent on a message; `chatSkill()` ships the agent-side
|
|
172
|
+
skill. `@odla-ai/pm` rides this for every comment and audit entry, which is why
|
|
173
|
+
a PM item's discussion and a group topic behave identically.
|
|
174
|
+
|
|
175
|
+
## @odla-ai/granola — meeting notes into odla-db and the CRM
|
|
176
|
+
|
|
177
|
+
Two triggers, **one** ingest path: a mountable webhook receiver
|
|
178
|
+
(`createGranolaRoutes`, Standard Webhooks verified) for live updates, and an
|
|
179
|
+
incremental `updated_after` poll (`syncNotes`) for backfill and reconciliation.
|
|
180
|
+
Both land in `ingestNoteById`.
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
odla-ai secrets set granola_api_key --env dev --stdin # Granola: Settings -> Connectors -> API keys
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
```ts
|
|
187
|
+
import { GRANOLA_RULES, GRANOLA_SCHEMA, initGranola, syncNotes } from "@odla-ai/granola";
|
|
188
|
+
const client = initGranola({ apiKey: env.GRANOLA_API_KEY });
|
|
189
|
+
await syncNotes({ db }, client); // { ingested, failed, lastUpdatedAt, truncated }
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Install `GRANOLA_SCHEMA` and `GRANOLA_RULES` like any other namespace set. The
|
|
193
|
+
rules are **deny-all on purpose** — these rows hold meeting transcripts, the
|
|
194
|
+
most sensitive thing most apps will store — so reads go through your worker,
|
|
195
|
+
never an end-user credential.
|
|
196
|
+
|
|
197
|
+
Wire `crmPort` from the separate `@odla-ai/granola/crm` entry and every attendee
|
|
198
|
+
becomes a person record, every email domain a company, and the note lands once
|
|
199
|
+
per person as a `kind: "meeting"` activity. Idempotency is a ledger
|
|
200
|
+
(`granola_note_link`), not a hope: a redelivered webhook writes no second
|
|
201
|
+
activity, and a re-run poll converges on identical rows.
|
|
202
|
+
|
|
203
|
+
## @odla-ai/email — structured Cloudflare Email Service sending
|
|
204
|
+
|
|
205
|
+
```ts
|
|
206
|
+
import { sendMessage, renderInvite, buildReply, parseInbound } from "@odla-ai/email";
|
|
207
|
+
await sendMessage(sender, { to, subject, html, attachments }); // fail-closed validation
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
The transport is injected, so tests never send. `parseInbound`/`verifyInbound`
|
|
211
|
+
handle mail arriving, `buildReply` threads the response. Sending needs the
|
|
212
|
+
sending domain onboarded first — ask `runbook ask "email sending domain"`.
|
|
213
|
+
|
|
214
|
+
## @odla-ai/workflows — effect-safety for Cloudflare Workflows
|
|
215
|
+
|
|
216
|
+
Replay-stable identities, canonical input fingerprints, an explicit idempotency
|
|
217
|
+
boundary, checkpoint validation, and a transactional-outbox reconciler
|
|
218
|
+
(`runIdempotentEffect`, `checkpoint`, `enqueueOutbox`, `reconcileOutbox`).
|
|
219
|
+
Web-standard APIs only — no Node built-ins, no `cloudflare:workers`.
|
|
220
|
+
|
|
160
221
|
## Others
|
|
161
222
|
|
|
162
223
|
- **@odla-ai/chapter** — membership sites from one `defineChapter()` config:
|
|
@@ -177,3 +238,27 @@ injected isolated executor and never falls back to the host shell.
|
|
|
177
238
|
- **@odla-ai/blog** — static-first blogging; files in, site out.
|
|
178
239
|
- **@odla-ai/apps** — control-plane SDK (create apps, toggle services); the CLI
|
|
179
240
|
and registry usually handle this for you.
|
|
241
|
+
- **@odla-ai/pm** — the project board this repository runs on: products ->
|
|
242
|
+
projects -> goals, kanban tasks, decisions, bugs, and versioned runbooks, on
|
|
243
|
+
odla-db and shared across co-owned projects. Usually driven through
|
|
244
|
+
`odla-ai pm ...` rather than the library.
|
|
245
|
+
- **@odla-ai/brand** — conversational brand-book builder: doc/image uploads,
|
|
246
|
+
agent-driven colour exploration with human-gated palette proposals, and a
|
|
247
|
+
compiler from the approved book to `@odla-ai/ui` design tokens.
|
|
248
|
+
- **@odla-ai/docs** — build-time docs engine: one Markdown source becomes both a
|
|
249
|
+
themed static site and a serializable in-app manifest, so an app renders docs
|
|
250
|
+
without shipping a Markdown parser.
|
|
251
|
+
- **@odla-ai/camel** — prompt-injection boundary for authority-bearing agents:
|
|
252
|
+
Safe/Unsafe values, closed conversions, effect authorization, and the dual-LLM
|
|
253
|
+
runners in `@odla-ai/camel/runner`. "Safe" means safe to place in a privileged
|
|
254
|
+
model's context — never factual, authorized, or harmless to display.
|
|
255
|
+
- **@odla-ai/graph** — dependency-free property graph with one traversal algebra
|
|
256
|
+
over any edge kind, plus extractors that build one from a codebase (imports,
|
|
257
|
+
exported symbols, the data surfaces a module reads and writes).
|
|
258
|
+
- **@odla-ai/test** — strict deterministic Worker/fetch/KV/D1/Workflow/clock
|
|
259
|
+
doubles for fast agent feedback: an unexpected network or database call fails
|
|
260
|
+
immediately rather than silently passing.
|
|
261
|
+
- **@odla-ai/harness** — the coding-task protocol and safe Mac/Linux runner
|
|
262
|
+
behind odla Code: disposable workspaces, container-isolated agents, and
|
|
263
|
+
Studio-controlled task leases. The agent gets no workspace mount, no
|
|
264
|
+
credentials, and no network — everything crosses a typed tool channel.
|