@octavus/docs 2.15.0 → 2.17.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.
Files changed (37) hide show
  1. package/content/01-getting-started/02-quickstart.md +1 -0
  2. package/content/02-server-sdk/01-overview.md +26 -0
  3. package/content/02-server-sdk/02-sessions.md +11 -0
  4. package/content/02-server-sdk/03-tools.md +4 -1
  5. package/content/02-server-sdk/04-streaming.md +9 -0
  6. package/content/02-server-sdk/08-computer.md +400 -0
  7. package/content/03-client-sdk/06-http-transport.md +2 -0
  8. package/content/04-protocol/01-overview.md +9 -0
  9. package/content/04-protocol/04-tools.md +5 -4
  10. package/content/04-protocol/05-skills.md +88 -8
  11. package/content/04-protocol/06-handlers.md +3 -1
  12. package/content/04-protocol/07-agent-config.md +65 -17
  13. package/content/04-protocol/09-skills-advanced.md +89 -8
  14. package/content/04-protocol/13-mcp-servers.md +289 -0
  15. package/content/06-examples/02-nextjs-chat.md +1 -0
  16. package/dist/chunk-4PNP4HF5.js +1549 -0
  17. package/dist/chunk-4PNP4HF5.js.map +1 -0
  18. package/dist/{chunk-2UFDUNPK.js → chunk-54ND2CTI.js} +25 -21
  19. package/dist/chunk-54ND2CTI.js.map +1 -0
  20. package/dist/chunk-B4A36GEV.js +1549 -0
  21. package/dist/chunk-B4A36GEV.js.map +1 -0
  22. package/dist/chunk-CFDET7QG.js +1549 -0
  23. package/dist/chunk-CFDET7QG.js.map +1 -0
  24. package/dist/chunk-DKVYIFV7.js +1549 -0
  25. package/dist/chunk-DKVYIFV7.js.map +1 -0
  26. package/dist/{chunk-JEOGYIRI.js → chunk-UZWGRPRR.js} +61 -21
  27. package/dist/chunk-UZWGRPRR.js.map +1 -0
  28. package/dist/content.js +1 -1
  29. package/dist/docs.json +34 -16
  30. package/dist/index.js +1 -1
  31. package/dist/search-index.json +1 -1
  32. package/dist/search.js +1 -1
  33. package/dist/search.js.map +1 -1
  34. package/dist/sections.json +34 -16
  35. package/package.json +1 -1
  36. package/dist/chunk-2UFDUNPK.js.map +0 -1
  37. package/dist/chunk-JEOGYIRI.js.map +0 -1
@@ -107,17 +107,19 @@ This also works for named threads in interactive agents, allowing different thre
107
107
 
108
108
  When skills are enabled, the LLM has access to these tools:
109
109
 
110
- | Tool | Purpose |
111
- | -------------------- | --------------------------------------- |
112
- | `octavus_skill_read` | Read skill documentation (SKILL.md) |
113
- | `octavus_skill_list` | List available scripts in a skill |
114
- | `octavus_skill_run` | Execute a pre-built script from a skill |
115
- | `octavus_code_run` | Execute arbitrary Python/Bash code |
116
- | `octavus_file_write` | Create files in the sandbox |
117
- | `octavus_file_read` | Read files from the sandbox |
110
+ | Tool | Purpose | Availability |
111
+ | -------------------- | --------------------------------------- | -------------------- |
112
+ | `octavus_skill_read` | Read skill documentation (SKILL.md) | All skills |
113
+ | `octavus_skill_list` | List available scripts in a skill | All skills |
114
+ | `octavus_skill_run` | Execute a pre-built script from a skill | All skills |
115
+ | `octavus_code_run` | Execute arbitrary Python/Bash code | Standard skills only |
116
+ | `octavus_file_write` | Create files in the sandbox | Standard skills only |
117
+ | `octavus_file_read` | Read files from the sandbox | Standard skills only |
118
118
 
119
119
  The LLM learns about available skills through system prompt injection and can use these tools to interact with skills.
120
120
 
121
+ Skills that have [secrets](#skill-secrets) configured run in **secure mode**, where only `octavus_skill_read`, `octavus_skill_list`, and `octavus_skill_run` are available. See [Skill Secrets](#skill-secrets) below.
122
+
121
123
  ## Example: QR Code Generation
122
124
 
123
125
  ```yaml
@@ -212,6 +214,17 @@ Main script for generating QR codes...
212
214
 
213
215
  ````
214
216
 
217
+ ### Frontmatter Fields
218
+
219
+ | Field | Required | Description |
220
+ | ------------- | -------- | ------------------------------------------------------ |
221
+ | `name` | Yes | Skill slug (lowercase, hyphens) |
222
+ | `description` | Yes | What the skill does (shown to the LLM) |
223
+ | `version` | No | Semantic version string |
224
+ | `license` | No | License identifier |
225
+ | `author` | No | Skill author |
226
+ | `secrets` | No | Array of secret declarations (enables secure mode) |
227
+
215
228
  ## Best Practices
216
229
 
217
230
  ### 1. Clear Descriptions
@@ -337,6 +350,72 @@ steps:
337
350
 
338
351
  Thread-level `sandboxTimeout` takes priority over agent-level. Maximum: 1 hour (3,600,000 ms).
339
352
 
353
+ ## Skill Secrets
354
+
355
+ Skills can declare secrets they need to function. When an organization configures those secrets, the skill runs in **secure mode** with additional isolation.
356
+
357
+ ### Declaring Secrets
358
+
359
+ Add a `secrets` array to your SKILL.md frontmatter:
360
+
361
+ ```yaml
362
+ ---
363
+ name: github
364
+ description: >
365
+ Run GitHub CLI (gh) commands to manage repos, issues, PRs, and more.
366
+ secrets:
367
+ - name: GITHUB_TOKEN
368
+ description: GitHub personal access token with repo access
369
+ required: true
370
+ - name: GITHUB_ORG
371
+ description: Default GitHub organization
372
+ required: false
373
+ ---
374
+ ```
375
+
376
+ Each secret declaration has:
377
+
378
+ | Field | Required | Description |
379
+ | ------------- | -------- | ----------------------------------------------------------- |
380
+ | `name` | Yes | Environment variable name (uppercase, e.g., `GITHUB_TOKEN`) |
381
+ | `description` | No | Explains what this secret is for (shown in the UI) |
382
+ | `required` | No | Whether the secret is required (defaults to `true`) |
383
+
384
+ Secret names must match the pattern `^[A-Z_][A-Z0-9_]*$` (uppercase letters, digits, and underscores).
385
+
386
+ ### Configuring Secrets
387
+
388
+ Organization admins configure secret values through the skill editor in the platform UI. Each organization maintains its own independent set of secrets for each skill.
389
+
390
+ Secrets are encrypted at rest and only decrypted at execution time.
391
+
392
+ ### Secure Mode
393
+
394
+ When a skill has secrets configured for the organization, it automatically runs in **secure mode**:
395
+
396
+ - The skill gets its own **isolated sandbox** (separate from other skills)
397
+ - Secrets are injected as **environment variables** available to all scripts
398
+ - Only `octavus_skill_read`, `octavus_skill_list`, and `octavus_skill_run` are available — `octavus_code_run`, `octavus_file_write`, and `octavus_file_read` are blocked
399
+ - Scripts receive input as **JSON via stdin** (using the `input` parameter on `octavus_skill_run`) instead of CLI args
400
+ - All output (stdout/stderr) is **automatically redacted** for secret values before being returned to the LLM
401
+
402
+ ### Writing Scripts for Secure Skills
403
+
404
+ Scripts in secure skills read input from stdin as JSON and access secrets from environment variables:
405
+
406
+ ```python
407
+ import json
408
+ import os
409
+ import sys
410
+
411
+ input_data = json.load(sys.stdin)
412
+ token = os.environ.get('GITHUB_TOKEN')
413
+
414
+ # Use the token and input_data to perform the task
415
+ ```
416
+
417
+ For standard skills (without secrets), scripts receive input as CLI arguments. For secure skills, always use stdin JSON.
418
+
340
419
  ## Security
341
420
 
342
421
  Skills run in isolated sandbox environments:
@@ -345,6 +424,7 @@ Skills run in isolated sandbox environments:
345
424
  - **No persistent storage** (sandbox destroyed after each `next-message` execution)
346
425
  - **File output only** via `/output/` directory
347
426
  - **Time limits** enforced (5-minute default, configurable via `sandboxTimeout`)
427
+ - **Secret redaction** — output from secure skills is automatically scanned for secret values
348
428
 
349
429
  ## Next Steps
350
430
 
@@ -144,16 +144,18 @@ Start summary thread:
144
144
  block: start-thread
145
145
  thread: summary # Thread name
146
146
  model: anthropic/claude-sonnet-4-5 # Optional: different model
147
+ backupModel: openai/gpt-4o # Failover on provider errors
147
148
  thinking: low # Extended reasoning level
148
149
  maxSteps: 1 # Tool call limit
149
150
  system: escalation-summary # System prompt
150
151
  input: [COMPANY_NAME] # Variables for prompt
152
+ mcpServers: [figma, browser] # MCP servers for this thread
151
153
  skills: [qr-code] # Octavus skills for this thread
152
154
  sandboxTimeout: 600000 # Skill sandbox timeout (default: 5 min, max: 1 hour)
153
155
  imageModel: google/gemini-2.5-flash-image # Image generation model
154
156
  ```
155
157
 
156
- The `model` field can also reference a variable for dynamic model selection:
158
+ The `model` field can also reference a variable for dynamic model selection. The `backupModel` field follows the same format and supports variable references.
157
159
 
158
160
  ```yaml
159
161
  Start summary thread:
@@ -14,28 +14,31 @@ agent:
14
14
  model: anthropic/claude-sonnet-4-5
15
15
  system: system # References prompts/system.md
16
16
  tools: [get-user-account] # Available tools
17
+ mcpServers: [figma, browser] # MCP server connections
17
18
  skills: [qr-code] # Available skills
18
19
  references: [api-guidelines] # On-demand context documents
19
20
  ```
20
21
 
21
22
  ## Configuration Options
22
23
 
23
- | Field | Required | Description |
24
- | ---------------- | -------- | --------------------------------------------------------- |
25
- | `model` | Yes | Model identifier or variable reference |
26
- | `system` | Yes | System prompt filename (without .md) |
27
- | `input` | No | Variables to pass to the system prompt |
28
- | `tools` | No | List of tools the LLM can call |
29
- | `skills` | No | List of Octavus skills the LLM can use |
30
- | `references` | No | List of references the LLM can fetch on demand |
31
- | `sandboxTimeout` | No | Skill sandbox timeout in ms (default: 5 min, max: 1 hour) |
32
- | `imageModel` | No | Image generation model (enables agentic image generation) |
33
- | `webSearch` | No | Enable built-in web search tool (provider-agnostic) |
34
- | `agentic` | No | Allow multiple tool call cycles |
35
- | `maxSteps` | No | Maximum agentic steps (default: 10) |
36
- | `temperature` | No | Model temperature (0-2) |
37
- | `thinking` | No | Extended reasoning level |
38
- | `anthropic` | No | Anthropic-specific options (tools, skills) |
24
+ | Field | Required | Description |
25
+ | ---------------- | -------- | ------------------------------------------------------------------------------ |
26
+ | `model` | Yes | Model identifier or variable reference |
27
+ | `backupModel` | No | Backup model for automatic failover on provider errors |
28
+ | `system` | Yes | System prompt filename (without .md) |
29
+ | `input` | No | Variables to pass to the system prompt |
30
+ | `tools` | No | List of tools the LLM can call |
31
+ | `mcpServers` | No | List of MCP servers to connect (see [MCP Servers](/docs/protocol/mcp-servers)) |
32
+ | `skills` | No | List of Octavus skills the LLM can use |
33
+ | `references` | No | List of references the LLM can fetch on demand |
34
+ | `sandboxTimeout` | No | Skill sandbox timeout in ms (default: 5 min, max: 1 hour) |
35
+ | `imageModel` | No | Image generation model (enables agentic image generation) |
36
+ | `webSearch` | No | Enable built-in web search tool (provider-agnostic) |
37
+ | `agentic` | No | Allow multiple tool call cycles |
38
+ | `maxSteps` | No | Maximum agentic steps (default: 10) |
39
+ | `temperature` | No | Model temperature (0-2) |
40
+ | `thinking` | No | Extended reasoning level |
41
+ | `anthropic` | No | Anthropic-specific options (tools, skills) |
39
42
 
40
43
  ## Models
41
44
 
@@ -104,6 +107,41 @@ The model value is validated at runtime to ensure it's in the correct `provider/
104
107
 
105
108
  > **Note**: When using dynamic models, provider-specific options (like `anthropic:`) may not apply if the model resolves to a different provider.
106
109
 
110
+ ## Backup Model
111
+
112
+ Configure a fallback model that activates automatically when the primary model encounters a transient provider error (rate limits, outages, timeouts):
113
+
114
+ ```yaml
115
+ agent:
116
+ model: anthropic/claude-sonnet-4-5
117
+ backupModel: openai/gpt-4o
118
+ system: system
119
+ ```
120
+
121
+ When a provider error occurs, the system retries once with the backup model. If the backup also fails, the original error is returned.
122
+
123
+ **Key behaviors:**
124
+
125
+ - Only transient provider errors trigger fallback — authentication and validation errors are not retried
126
+ - Provider-specific options (like `anthropic:`) are only forwarded to the backup model if it uses the same provider
127
+ - For streaming responses, fallback only occurs if no content has been sent to the client yet
128
+
129
+ Like `model`, `backupModel` supports variable references:
130
+
131
+ ```yaml
132
+ input:
133
+ BACKUP_MODEL:
134
+ type: string
135
+ description: Fallback model for provider errors
136
+
137
+ agent:
138
+ model: anthropic/claude-sonnet-4-5
139
+ backupModel: BACKUP_MODEL
140
+ system: system
141
+ ```
142
+
143
+ > **Tip**: Use a different provider for your backup model (e.g., primary on Anthropic, backup on OpenAI) to maximize resilience against single-provider outages.
144
+
107
145
  ## System Prompt
108
146
 
109
147
  The system prompt sets the agent's persona and instructions. The `input` field controls which variables are available to the prompt — only variables listed in `input` are interpolated.
@@ -358,16 +396,18 @@ handlers:
358
396
  block: start-thread
359
397
  thread: summary
360
398
  model: anthropic/claude-sonnet-4-5 # Different model
399
+ backupModel: openai/gpt-4o # Failover model
361
400
  thinking: low # Different thinking
362
401
  maxSteps: 1 # Limit tool calls
363
402
  system: escalation-summary # Different prompt
403
+ mcpServers: [figma, browser] # Thread-specific MCP servers
364
404
  skills: [data-analysis] # Thread-specific skills
365
405
  references: [escalation-policy] # Thread-specific references
366
406
  imageModel: google/gemini-2.5-flash-image # Thread-specific image model
367
407
  webSearch: true # Thread-specific web search
368
408
  ```
369
409
 
370
- Each thread can have its own skills, references, image model, and web search setting. Skills must be defined in the protocol's `skills:` section. References must exist in the agent's `references/` directory. Workers use this same pattern since they don't have a global `agent:` section.
410
+ Each thread can have its own model, backup model, MCP servers, skills, references, image model, and web search setting. Skills must be defined in the protocol's `skills:` section. References must exist in the agent's `references/` directory. Workers use this same pattern since they don't have a global `agent:` section.
371
411
 
372
412
  ## Full Example
373
413
 
@@ -399,6 +439,12 @@ tools:
399
439
  summary: { type: string }
400
440
  priority: { type: string } # low, medium, high
401
441
 
442
+ mcpServers:
443
+ figma:
444
+ description: Figma design tool integration
445
+ source: remote
446
+ display: description
447
+
402
448
  skills:
403
449
  qr-code:
404
450
  display: description
@@ -406,6 +452,7 @@ skills:
406
452
 
407
453
  agent:
408
454
  model: anthropic/claude-sonnet-4-5
455
+ backupModel: openai/gpt-4o
409
456
  system: system
410
457
  input:
411
458
  - COMPANY_NAME
@@ -414,6 +461,7 @@ agent:
414
461
  - get-user-account
415
462
  - search-docs
416
463
  - create-support-ticket
464
+ mcpServers: [figma] # MCP server connections
417
465
  skills: [qr-code] # Octavus skills
418
466
  references: [support-policies] # On-demand context
419
467
  webSearch: true # Built-in web search
@@ -307,6 +307,76 @@ Pattern:
307
307
  2. LLM uses skill to analyze/process the data
308
308
  3. Generate outputs (files, reports)
309
309
 
310
+ ## Secure Skills
311
+
312
+ When a skill declares secrets and an organization configures them, the skill runs in secure mode with its own isolated sandbox.
313
+
314
+ ### Standard vs Secure Skills
315
+
316
+ | Aspect | Standard Skills | Secure Skills |
317
+ | ------------------- | --------------------------------- | --------------------------------------------------- |
318
+ | **Sandbox** | Shared with other standard skills | Isolated (one per skill) |
319
+ | **Available tools** | All 6 skill tools | `skill_read`, `skill_list`, `skill_run` only |
320
+ | **Script input** | CLI arguments via `args` | JSON via stdin (use `input` parameter) |
321
+ | **Environment** | No secrets | Secrets as env vars |
322
+ | **Output** | Raw stdout/stderr | Redacted (secret values replaced with `[REDACTED]`) |
323
+
324
+ ### Writing Scripts for Secure Skills
325
+
326
+ Secure skill scripts receive structured input via stdin (JSON) and access secrets from environment variables:
327
+
328
+ ```python
329
+ #!/usr/bin/env python3
330
+ import json
331
+ import os
332
+ import sys
333
+ import subprocess
334
+
335
+ input_data = json.load(sys.stdin)
336
+ token = os.environ["GITHUB_TOKEN"]
337
+
338
+ repo = input_data.get("repo", "")
339
+ result = subprocess.run(
340
+ ["gh", "repo", "view", repo, "--json", "name,description"],
341
+ capture_output=True, text=True,
342
+ env={**os.environ, "GH_TOKEN": token}
343
+ )
344
+
345
+ print(result.stdout)
346
+ ```
347
+
348
+ Key patterns:
349
+
350
+ - **Read stdin**: `json.load(sys.stdin)` to get the `input` object from the `octavus_skill_run` call
351
+ - **Access secrets**: `os.environ["SECRET_NAME"]` — secrets are injected as env vars
352
+ - **Print output**: Write results to stdout — the LLM sees the (redacted) stdout
353
+ - **Error handling**: Write errors to stderr and exit with non-zero code
354
+
355
+ ### Declaring Secrets in SKILL.md
356
+
357
+ ```yaml
358
+ ---
359
+ name: github
360
+ description: >
361
+ Run GitHub CLI (gh) commands to manage repos, issues, PRs, and more.
362
+ secrets:
363
+ - name: GITHUB_TOKEN
364
+ description: GitHub personal access token with repo access
365
+ required: true
366
+ - name: GITHUB_ORG
367
+ description: Default GitHub organization
368
+ required: false
369
+ ---
370
+ ```
371
+
372
+ ### Testing Secure Skills Locally
373
+
374
+ You can test scripts locally by piping JSON to stdin:
375
+
376
+ ```bash
377
+ echo '{"repo": "octavus-ai/agent-sdk"}' | GITHUB_TOKEN=ghp_xxx python scripts/list-issues.py
378
+ ```
379
+
310
380
  ## Skill Development Tips
311
381
 
312
382
  ### Writing SKILL.md
@@ -373,6 +443,15 @@ The LLM sees these errors and can retry or explain to users.
373
443
  - **File output only** via `/output/` directory
374
444
  - **Time limits** enforced (5-minute default, configurable via `sandboxTimeout`)
375
445
 
446
+ ### Secret Protection
447
+
448
+ For skills with configured secrets:
449
+
450
+ - **Isolated sandbox** — each secure skill gets its own sandbox, preventing cross-skill secret leakage
451
+ - **No arbitrary code** — `octavus_code_run`, `octavus_file_write`, and `octavus_file_read` are blocked for secure skills, so only pre-built scripts can execute
452
+ - **Output redaction** — all stdout and stderr are scanned for secret values before being returned to the LLM
453
+ - **Encrypted at rest** — secrets are encrypted using AES-256-GCM and only decrypted at execution time
454
+
376
455
  ### Input Validation
377
456
 
378
457
  Skills should validate inputs:
@@ -455,14 +534,16 @@ Check execution logs in the platform debug view:
455
534
 
456
535
  ## Best Practices Summary
457
536
 
458
- 1. **Enable only needed skills** - Don't overwhelm the LLM
459
- 2. **Choose appropriate display modes** - Match user experience needs
460
- 3. **Write clear skill descriptions** - Help LLM understand when to use
461
- 4. **Handle errors gracefully** - Provide helpful error messages
462
- 5. **Test skills locally** - Verify before uploading
463
- 6. **Monitor execution** - Check logs for issues
464
- 7. **Combine with tools** - Use tools for data, skills for processing
465
- 8. **Consider performance** - Be aware of timeouts and limits
537
+ 1. **Enable only needed skills** Don't overwhelm the LLM
538
+ 2. **Choose appropriate display modes** Match user experience needs
539
+ 3. **Write clear skill descriptions** Help LLM understand when to use
540
+ 4. **Handle errors gracefully** Provide helpful error messages
541
+ 5. **Test skills locally** Verify before uploading
542
+ 6. **Monitor execution** Check logs for issues
543
+ 7. **Combine with tools** Use tools for data, skills for processing
544
+ 8. **Consider performance** Be aware of timeouts and limits
545
+ 9. **Use secrets for credentials** — Declare secrets in frontmatter instead of hardcoding tokens
546
+ 10. **Design scripts for stdin input** — Secure skills receive JSON via stdin, so plan for both input methods if the skill might be used in either mode
466
547
 
467
548
  ## Next Steps
468
549