Secrets
Stored values the agent can use without ever reading them
On this page(23 sections)
- Store a secret
- Names of the stored secrets
- Make and store a random secret
- Delete a secret
- Every secret this sandbox holds, from everywhere
- Show one secret's value
- Which credentials need somebody's approval
- Put a credential behind named approvers
- Stop requiring approval for a credential
- Which secrets are host-guarded, and where they may go
- Turn a secret's host guard on or off, and set its hosts
- Which programs each secret may be typed into
- Set which programs a secret may be typed into
- Type a secret into the focused window on one of your computers
- The keyrings on your computers
- Pair the keyrings on two of your computers
- Ask the owner's computers for a credential by where it is used
- The passwords this sandbox may use
- Credentials this sandbox asked for that wait for an answer
- This sandbox's uses of the owner's passwords
- How a connection's credential reaches the agent, and what it may do
- Set how a connection's credential reaches the agent, and its rules
- Ask a named person to release a credential
Write a secret, list which names exist, delete one. Revealing a value is the deliberate exception and the only route that hands one back; everywhere else the daemon substitutes a secret by reference at the moment a command runs.
23 calls. Pick one to open it, or use the list on the right.
POST/secretsStore a secret
Writes one name and value where the agent's references resolve it, without a restart: desired-state/.env once DevOps is active, the sandbox's own secret store before that.
What you send
| Field | Type | Where |
|---|---|---|
keyrequiredThe name to store it under,… | string | body |
valuerequiredThe value | string | body |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/secrets" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"key":"OPENAI_API_KEY","value":"…"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.set({
"key": "OPENAI_API_KEY",
"value": "…"
});GET/secretsNames of the stored secrets
Which secrets exist here. Names only, never values.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
keysThe names that exist here | string[] |
curl "$SANDBOX/secrets" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.list();POST/secrets/generateMake and store a random secret
Makes a random value and stores it under a new name, where `set` would have put it, for a secret nobody has to find or paste (a session key, a signing secret, a password the task sets up itself). Answers the name and its length, never the value. Refused for a name something here already holds.
What you send
| Field | Type | Where |
|---|---|---|
keyrequiredThe name to store it under:… | string | body |
bytesHow much randomness, in bytes | integer | body |
formatHow it is spelled: `hex` (0-9,… | "hex" | "base64url" | "alnum" | body |
What comes back
| Field | Type |
|---|---|
keyThe name it is stored under | string |
lengthHow many characters it is, which… | integer |
storedWhere it was kept: desired-state/.env once… | "env" | "sandbox" |
curl -X POST "$SANDBOX/secrets/generate" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"key":"OPENAI_API_KEY","bytes":32,"format":"hex"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.generate({
"key": "OPENAI_API_KEY",
"bytes": 32,
"format": "hex"
});DELETE/secrets/{key}Delete a secret
Removes one by name.
What you send
| Field | Type | Where |
|---|---|---|
keyrequiredWhich secret, by name | string | address |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X DELETE "$SANDBOX/secrets/OPENAI_API_KEY" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.remove({
"key": "OPENAI_API_KEY"
});GET/secrets/inventoryEvery secret this sandbox holds, from everywhere
One view across all the places secrets live here: what exists, where it came from and whether it is working. Never any values. This one always answers, even before there is a store to write to.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
entriesOne entry per secret this sandbox… | object[] |
keyWhat identifies it | string |
kindWhere it came from: you set… | "env" | "generated" | "capability" | "provider" … (5) |
labelA friendlier name, for entries that… | string |
statusWhether it exists and, for a… | "missing" | "set" | "connected" |
requiredByWhat is waiting on it | object[] |
resourceIdWhich resource | string |
typeWhat kind of resource it is | string |
storedAtWhere it actually lives, in words | string |
revealableWhether its value can be shown… | boolean |
ciWhether a copy has been given… | object |
syncedWhether the pipeline has it | boolean |
pushedAtWhen it was last sent there | string |
lastUseThe last time an agent actually… | object |
atWhen, in milliseconds | number |
laneHow it was used: a command,… | "shell" | "code" | "browser" | "gateway" … (7) |
detailWhere it went: the start of… | string |
approvedByWho released it for that use,… | string |
credentialHow the agent gets this connection's… | object |
deliveryHow the agent gets this connection's… | "gateway" | "raw" | "direct" | "ssh-agent" |
rulesWhat the credential may do through… | object[] |
methodsThe HTTP methods it covers (`DELETE`,… | string[] |
pathsThe paths it covers, below the… | string[] |
action`allow` forwards it, `ask` holds it… | "allow" | "ask" | "deny" |
whyOne line on what the rule… | string |
rulesFromWhose rules these are: the connector's… | "connector" | "owner" |
gateWho has to release this before… | object |
approversWho may release it, by email | string[] |
scopeHow far one release goes: `use`… | "use" | "conversation" |
hostsIts host guard | object |
guardWhether a use off the list,… | boolean |
listThe hosts it goes to unasked… | string[] |
sourceWho set it: the owner, the… | "owner" | "connector" | "keyring" |
programsWhich programs on the owner's computers,… | object |
programsPrograms, by executable name or whole… | string[] |
packagesAndroid apps, by package name, it… | string[] |
anyFieldWhether it may go into a… | boolean |
sourceWho keeps the list: the owner,… | "owner" | "keyring" |
deviceWhere a secret held on one… | object |
machineWhich computer's keyring holds it, by… | string |
modeHow the keyring answers this sandbox:… | "each-use" | "while-here" | "copy" |
onlineWhether that computer answers now | boolean |
lockedWhether the keyring there is locked,… | boolean |
sourceWhere the value itself is read… | "keyring" | "bitwarden" | "1password" | "keepassxc" |
curl "$SANDBOX/secrets/inventory" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.inventory();POST/secrets/revealShow one secret's value
The only call that hands a value back, and it is for the owner alone. Sent as a body rather than in the address, so the name never ends up in a log or a browser's history.
What you send
| Field | Type | Where |
|---|---|---|
keyrequiredWhich secret, by name | string | body |
What comes back
| Field | Type |
|---|---|
valueThe value itself | string |
curl -X POST "$SANDBOX/secrets/reveal" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"key":"OPENAI_API_KEY"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.reveal({
"key": "OPENAI_API_KEY"
});GET/secrets/gatesWhich credentials need somebody's approval
What is gated and who may release it. Names and addresses only, never values, and the agent may read it too: knowing a credential needs Bob is what stops it concluding the account is simply not connected.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
gatesEvery gate in force | object[] |
subjectWhat is gated: a secret's name,… | string |
kindWhether this gate covers one stored… | "secret" | "capability" |
approversExactly who may release it, by… | string[] |
scopeHow far one release goes: `use`… | "use" | "conversation" |
curl "$SANDBOX/secrets/gates" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.gates();PUT/secrets/gates/{subject}Put a credential behind named approvers
Names exactly who may release one secret or one connected account, and how far a single release goes. The owner's call alone. A signed-in browser or a mounted server cannot be released for one use, so those are always for the rest of the conversation.
What you send
| Field | Type | Where |
|---|---|---|
subjectrequiredWhat is gated: a secret's name,… | string | address |
kindrequiredWhether this gate covers one stored… | "secret" | "capability" | body |
approversrequiredExactly who may release it, by… | string[] | body |
scoperequiredHow far one release goes: `use`… | "use" | "conversation" | body |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X PUT "$SANDBOX/secrets/gates/Fix%20the%20flaky%20parser%20test" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"kind":"secret","approvers":["…","…"],"scope":"use"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.setGate({
"subject": "Fix the flaky parser test",
"kind": "secret",
"approvers": [
"…",
"…"
],
"scope": "use"
});DELETE/secrets/gates/{subject}Stop requiring approval for a credential
Removes one gate, so the agent can use that credential the way it uses any other. The owner's call alone.
What you send
| Field | Type | Where |
|---|---|---|
subjectrequiredWhich gate, by the secret name… | string | address |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X DELETE "$SANDBOX/secrets/gates/Fix%20the%20flaky%20parser%20test" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.removeGate({
"subject": "Fix the flaky parser test"
});GET/secrets/hostsWhich secrets are host-guarded, and where they may go
Every secret and connected account whose host guard is set, on or off, and its hosts. With the guard on, a use aimed off the list, or anywhere a command's text does not show, asks a person first, whatever the safety judge says. Names and hosts only, never values.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
guardsEvery secret whose host guard has… | object[] |
subjectWhich secret, by the name its… | string |
kindWhether this gate covers one stored… | "secret" | "capability" |
guardOn: a use off the list,… | boolean |
hostsWhere it goes without asking while… | string[] |
sourceWho set it: the owner, the… | "owner" | "connector" | "keyring" |
curl "$SANDBOX/secrets/hosts" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.hosts();PUT/secrets/hosts/{subject}Turn a secret's host guard on or off, and set its hosts
Replaces one secret's host guard. Anybody who may use secrets can turn it on or take hosts away; turning it off or adding a host is the owner's: from the agent it raises a card for the owner in the live conversation and waits for their answer.
What you send
| Field | Type | Where |
|---|---|---|
subjectrequiredWhich secret, by name, or which… | string | address |
kindWhether the subject is a secret… | "secret" | "capability" | body |
guardrequiredWhether a use off the list,… | boolean | body |
hostsrequiredThe whole new list | string[] | body |
conversationIdWhich conversation to ask the owner… | string | body |
What comes back
| Field | Type |
|---|---|
guardWhether the guard is on now | boolean |
hostsWhere it goes without asking while… | string[] |
approvedByWho approved the change, when it… | string |
curl -X PUT "$SANDBOX/secrets/hosts/Fix%20the%20flaky%20parser%20test" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"kind":"secret","guard":true,"hosts":["sandbox-a1b2c3d4e5f6.intentic.dev","sandbox-a1b2c3d4e5f6.intentic.dev"],"conversationId":"nightly-changelog"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.setHosts({
"subject": "Fix the flaky parser test",
"kind": "secret",
"guard": true,
"hosts": [
"sandbox-a1b2c3d4e5f6.intentic.dev",
"sandbox-a1b2c3d4e5f6.intentic.dev"
],
"conversationId": "nightly-changelog"
});GET/secrets/programsWhich programs each secret may be typed into
Every sandbox-held secret whose program list is set: the programs on the owner's computers and the phone apps it goes into unasked. A secret held in a computer's keyring carries its own list, shown on its inventory row. Names and programs only, never values.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
guardsEvery sandbox-held secret whose program list… | object[] |
programsPrograms, by executable name or whole… | string[] |
packagesAndroid apps, by package name, it… | string[] |
anyFieldWhether it may go into a… | boolean |
subjectWhich secret, by the name its… | string |
curl "$SANDBOX/secrets/programs" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.programs();PUT/secrets/programs/{subject}Set which programs a secret may be typed into
Replaces one sandbox-held secret's program list. Taking programs away, or turning `anyField` off, is open to anybody who may use secrets; adding one is the owner's: from the agent it raises a card for the owner in the live conversation and waits. Refused for a secret a computer's keyring holds, whose list is changed on that computer.
What you send
| Field | Type | Where |
|---|---|---|
subjectrequiredWhich secret, by the name its… | string | address |
programsrequiredPrograms, by executable name or whole… | string[] | body |
packagesrequiredAndroid apps, by package name, it… | string[] | body |
anyFieldrequiredWhether it may go into a… | boolean | body |
conversationIdWhich conversation to ask the owner… | string | body |
What comes back
| Field | Type |
|---|---|
programsPrograms, by executable name or whole… | string[] |
packagesAndroid apps, by package name, it… | string[] |
anyFieldWhether it may go into a… | boolean |
approvedByWho approved the change, when it… | string |
curl -X PUT "$SANDBOX/secrets/programs/Fix%20the%20flaky%20parser%20test" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"programs":["…","…"],"packages":["…","…"],"anyField":true,"conversationId":"nightly-changelog"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.setPrograms({
"subject": "Fix the flaky parser test",
"programs": [
"…",
"…"
],
"packages": [
"…",
"…"
],
"anyField": true,
"conversationId": "nightly-changelog"
});POST/secrets/type-intoType a secret into the focused window on one of your computers
After a short countdown, types one secret into whatever has focus on the computer named, through its keyring, which checks the window and still asks there when the entry's share says to. Answers what it went into, never the value.
What you send
| Field | Type | Where |
|---|---|---|
keyrequiredWhich secret, by name | string | body |
devicerequiredWhich computer, by its device card… | string | body |
countdownSecondsHow long to wait before typing,… | integer | body |
What comes back
| Field | Type |
|---|---|
programWhat it was typed into | string |
fieldWhether the focused field was a… | "password" | "text" |
askedWhether the person at the computer… | boolean |
curl -X POST "$SANDBOX/secrets/type-into" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"key":"OPENAI_API_KEY","device":"…","countdownSeconds":3}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.typeInto({
"key": "OPENAI_API_KEY",
"device": "…",
"countdownSeconds": 3
});GET/secrets/keyringsThe keyrings on your computers
Every connected computer with a keyring this sandbox can reach: whether it answers and is unlocked, how many of its entries are shared here, and whom it is paired with. Names and counts only, never values.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
keyrings | object[] |
machineThe computer, by its device card | string |
onlineWhether it answers now | boolean |
lockedWhether its keyring is locked, as… | boolean |
setUpWhether its keyring answers with a… | boolean |
versionThe keyring's release, as last heard | string |
pendingInboxValues sent to be kept there… | integer |
sharedHow many of its entries are… | integer |
syncIts pairing with the owner's other… | object |
fingerprintIts sync key's fingerprint, to compare… | string |
peersThe computers it is paired with,… | string[] |
curl "$SANDBOX/secrets/keyrings" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.keyrings();POST/secrets/keyrings/pairPair the keyrings on two of your computers
Asks each computer's keyring to pair with the other: each shows a prompt with both fingerprints, and only a yes on both pairs them. After that each keeps the other's entries in step, sealed between them and carried by this sandbox, which cannot open what it carries.
What you send
| Field | Type | Where |
|---|---|---|
arequiredOne computer, by its device card | string | body |
brequiredThe other | string | body |
What comes back
| Field | Type |
|---|---|
fingerprintsEach keyring's sync-key fingerprint, as both… | object |
a | string |
b | string |
curl -X POST "$SANDBOX/secrets/keyrings/pair" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"a":"…","b":"…"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.keyringPair({
"a": "…",
"b": "…"
});POST/secrets/wantAsk the owner's computers for a credential by where it is used
Asks each of the owner's computers with Passwords set up, most recently used first, for a credential that works at the place named (a site, a program, an ssh target, a git host). The person there is asked whether this sandbox may use it, and on what terms. Answers the name a reference uses once allowed, or that the answer is awaited in Passwords. Never a value.
What you send
| Field | Type | Where |
|---|---|---|
originrequiredWhere it is to be used:… | object | body |
when kind is "site" | shape | body |
hostrequiredThe page's host, `github.com`; never a… | string | body |
when kind is "program" | shape | body |
programrequiredA program, by its executable's file… | string | body |
labelThe program's own name for people,… | string | body |
when kind is "package" | shape | body |
packagerequiredAn Android app, by its package… | string | body |
label | string | body |
when kind is "ssh" | shape | body |
targetrequired`user@host`, as ssh's prompt names it | string | body |
when kind is "ssh-key" | shape | body |
pathrequired | string | body |
when kind is "sudo" | shape | body |
user | string | body |
when kind is "git" | shape | body |
urlrequired`https://host`, as git's credential helper or… | string | body |
when kind is "prompt" | shape | body |
textrequiredThe prompt's own words, `Password for… | string | body |
commandThe command that asked, `npm login`,… | string | body |
sandboxThe sandbox whose terminal asked, for… | string | body |
usernameThe account wanted, when the agent… | string | body |
whyrequiredWhat it is for, in words… | string | body |
conversationId | string | body |
What comes back
| Field | Type |
|---|---|
when state is "allowed" | shape |
nameThe name a secret reference uses… | string |
machineThe computer whose keyring shares it | string |
message | string |
when state is "pending" | shape |
id | string |
machine | string |
messageWhere the owner's answer is awaited | string |
when state is "denied" | shape |
message | string |
when state is "unknown" | shape |
messageNo keyring had it and nobody… | string |
curl -X POST "$SANDBOX/secrets/want" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"origin":{"kind":"site","host":"sandbox-a1b2c3d4e5f6.intentic.dev"},"username":"…","why":"…","conversationId":"nightly-changelog"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.want({
"origin": {
"kind": "site",
"host": "sandbox-a1b2c3d4e5f6.intentic.dev"
},
"username": "…",
"why": "…",
"conversationId": "nightly-changelog"
});GET/secrets/passwordsThe passwords this sandbox may use
Every entry the keyrings on the owner's computers share with this sandbox, where each works and how this sandbox may use it, and each computer's Passwords state. Names and places only, never values.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
sandboxThis sandbox's own address, as the… | string |
items | object[] |
name | string |
title | string |
kind | "password" | "text" |
originsWhere it works, from the entry's… | object[] |
when kind is "site" | shape |
hostThe page's host, `github.com`; never a… | string |
when kind is "program" | shape |
programA program, by its executable's file… | string |
labelThe program's own name for people,… | string |
when kind is "package" | shape |
packageAn Android app, by its package… | string |
label | string |
when kind is "ssh" | shape |
target`user@host`, as ssh's prompt names it | string |
when kind is "ssh-key" | shape |
path | string |
when kind is "sudo" | shape |
user | string |
when kind is "git" | shape |
url`https://host`, as git's credential helper or… | string |
when kind is "prompt" | shape |
textThe prompt's own words, `Password for… | string |
commandThe command that asked, `npm login`,… | string |
sandboxThe sandbox whose terminal asked, for… | string |
anyField | boolean |
machineThe computer whose keyring keeps it | string |
modeHow this sandbox may use it | "each-use" | "while-here" | "copy" |
online | boolean |
updatedAt | number |
lastUsedAtThis sandbox's last use of it,… | number |
keyrings | object[] |
machine | string |
online | boolean |
setUpAnswering, set up, and trusted by… | boolean |
locked | boolean |
remember | object |
browserSign-ins in a browser with the… | boolean |
terminalssh, sudo and git prompts on… | boolean |
appsPassword fields in programs on this… | boolean |
phoneThe paired phone's autofill | boolean |
sandboxPrompts that hide what is typed,… | boolean |
curl "$SANDBOX/secrets/passwords" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.passwords();GET/secrets/passwords/needsCredentials this sandbox asked for that wait for an answer
The needs this sandbox raised (`secrets want`) that the owner has not answered yet, and on which computer each waits.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
needs | object[] |
id | string |
origin | object |
when kind is "site" | shape |
hostThe page's host, `github.com`; never a… | string |
when kind is "program" | shape |
programA program, by its executable's file… | string |
labelThe program's own name for people,… | string |
when kind is "package" | shape |
packageAn Android app, by its package… | string |
label | string |
when kind is "ssh" | shape |
target`user@host`, as ssh's prompt names it | string |
when kind is "ssh-key" | shape |
path | string |
when kind is "sudo" | shape |
user | string |
when kind is "git" | shape |
url`https://host`, as git's credential helper or… | string |
when kind is "prompt" | shape |
textThe prompt's own words, `Password for… | string |
commandThe command that asked, `npm login`,… | string |
sandboxThe sandbox whose terminal asked, for… | string |
username | string |
detail | string |
conversation | string |
machineThe computer it was answered on,… | string |
state | "pending" | "allowed" | "denied" | "unknown" |
nameThe entry it was answered with,… | string |
at | integer |
curl "$SANDBOX/secrets/passwords/needs" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.passwordNeeds();GET/secrets/passwords/activityThis sandbox's uses of the owner's passwords
Each time this sandbox used a password one of the owner's keyrings keeps, newest first, from its own use ledger. Never a value.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
lines | object[] |
at | number |
name | string |
lane | string |
detail | string |
approvedBy | string |
curl "$SANDBOX/secrets/passwords/activity" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.passwordActivity();GET/secrets/policy/{subject}How a connection's credential reaches the agent, and what it may do
Whether the credential gateway holds this connection's credential or the agent is handed it, and the method and path rules the gateway enforces on every request it attaches it to. Names and rules only, never values.
What you send
| Field | Type | Where |
|---|---|---|
subjectrequiredWhich gate, by the secret name… | string | address |
What comes back
| Field | Type |
|---|---|
subjectThe connection's id | string |
deliveryHow the agent gets this connection's… | "gateway" | "raw" | "direct" | "ssh-agent" |
rulesWhat the credential may do through… | object[] |
methodsThe HTTP methods it covers (`DELETE`,… | string[] |
pathsThe paths it covers, below the… | string[] |
action`allow` forwards it, `ask` holds it… | "allow" | "ask" | "deny" |
whyOne line on what the rule… | string |
rulesFromWhose rules these are: the connector's… | "connector" | "owner" |
curl "$SANDBOX/secrets/policy/Fix%20the%20flaky%20parser%20test" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.policy({
"subject": "Fix the flaky parser test"
});PUT/secrets/policy/{subject}Set how a connection's credential reaches the agent, and its rules
The owner's alone, and never the agent's: handing the agent the credential itself, or replacing what the gateway lets it do, is a decision about the credential, not a use of it.
What you send
| Field | Type | Where |
|---|---|---|
subjectrequiredThe connection's id | string | address |
deliveryHand the agent the credential itself… | "gateway" | "raw" | body |
rulesThe owner's own rules, replacing the… | object[] | null | body |
methodsThe HTTP methods it covers (`DELETE`,… | string[] | body |
pathsThe paths it covers, below the… | string[] | body |
actionrequired`allow` forwards it, `ask` holds it… | "allow" | "ask" | "deny" | body |
whyOne line on what the rule… | string | body |
What comes back
| Field | Type |
|---|---|
subjectThe connection's id | string |
deliveryHow the agent gets this connection's… | "gateway" | "raw" | "direct" | "ssh-agent" |
rulesWhat the credential may do through… | object[] |
methodsThe HTTP methods it covers (`DELETE`,… | string[] |
pathsThe paths it covers, below the… | string[] |
action`allow` forwards it, `ask` holds it… | "allow" | "ask" | "deny" |
whyOne line on what the rule… | string |
rulesFromWhose rules these are: the connector's… | "connector" | "owner" |
curl -X PUT "$SANDBOX/secrets/policy/Fix%20the%20flaky%20parser%20test" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"delivery":"gateway","rules":[{"methods":["…","…"],"paths":["src/app.ts","README.md"],"action":"allow","why":"…"},{"methods":["…","…"],"paths":["src/app.ts","README.md"],"action":"ask","why":"…"}]}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.setPolicy({
"subject": "Fix the flaky parser test",
"delivery": "gateway",
"rules": [
{
"methods": [
"…",
"…"
],
"paths": [
"src/app.ts",
"README.md"
],
"action": "allow",
"why": "…"
},
{
"methods": [
"…",
"…"
],
"paths": [
"src/app.ts",
"README.md"
],
"action": "ask",
"why": "…"
}
]
});POST/secrets/requestAsk a named person to release a credential
Raises the release card in the live conversation and waits for one of the people named on it. Refused, rather than held, when there is nobody to ask: an unattended turn, no live conversation, or a click with no verified identity behind it.
What you send
| Field | Type | Where |
|---|---|---|
subjectrequiredWhat to ask for: the secret's… | string | body |
whyOne line on what it is… | string | body |
conversationIdWhich conversation to raise the card… | string | body |
What comes back
| Field | Type |
|---|---|
grantedAlways true: a refusal is an… | true |
approvedByWho released it | string |
messageWhat the grant means in practice,… | string |
curl -X POST "$SANDBOX/secrets/request" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"subject":"Fix the flaky parser test","why":"…","conversationId":"nightly-changelog"}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.secrets.request({
"subject": "Fix the flaky parser test",
"why": "…",
"conversationId": "nightly-changelog"
});