@kosuke-ai/kosuke 1.0.6 → 1.0.7
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 +6 -0
- package/dist/generated/commands/devices/list.js +1 -1
- package/dist/generated/commands/devices/request.js +1 -1
- package/dist/generated/commands/integrations/tools.js +1 -1
- package/dist/generated/commands/personal-tasks/create.js +1 -1
- package/dist/generated/commands/personal-tasks/move.js +1 -1
- package/dist/generated/commands/personal-tasks/start.js +2 -1
- package/dist/generated/commands/projects/create.js +1 -1
- package/dist/generated/commands/projects/skills.js +1 -1
- package/dist/generated/commands/projects/switch-workflow.js +1 -1
- package/dist/generated/commands/sensei/memory-get.js +1 -1
- package/dist/generated/commands/sensei/memory-put.js +0 -2
- package/dist/generated/commands/sensei/messages-send.js +1 -1
- package/dist/generated/commands/sensei/suggest.js +1 -1
- package/dist/generated/commands/sensei/thread-move.js +1 -1
- package/dist/generated/commands/sensei/thread-split.js +1 -1
- package/dist/generated/commands/sessions/artifacts-get.js +1 -1
- package/dist/generated/commands/sessions/create.js +1 -1
- package/dist/generated/commands/sessions/edit-prompt.js +1 -1
- package/dist/generated/commands/sessions/send.js +1 -1
- package/dist/generated/commands/sessions/steer.js +1 -1
- package/dist/generated/commands/sessions/update.js +1 -1
- package/dist/generated/commands/tasks/all.js +3 -2
- package/dist/generated/commands/tasks/create.js +5 -3
- package/dist/generated/commands/tasks/list.js +3 -2
- package/dist/generated/commands/tasks/start.js +3 -2
- package/dist/generated/commands/tasks/update.js +4 -2
- package/dist/generated/commands/user/crons-create.js +1 -1
- package/dist/runtime/agent-tokens.js +2 -8
- package/dist/runtime/attach.js +8 -41
- package/openapi.json +38 -28
- package/package.json +6 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.0.7
|
|
4
|
+
|
|
5
|
+
- Remove the hidden `workspaces sensei-*` and `workspaces lead-*` commands and stop reading `kosuke_lead_` tokens as Sensei tokens; use the `sensei` commands.
|
|
6
|
+
- Command help now carries what the agent guides used to: duplicate checks on `tasks list` and `tasks all`, `--include-prompt` and `--if-revision` meanings, ticket message keys and refusal handling on `sensei messages send`, the YOLO switch steps on `projects switch-workflow`, integration reach on `integrations tools`, and when to use `sessions send` over `sessions steer`.
|
|
7
|
+
- `sensei memory get` and `sensei memory put` work on one Memory file, `general.md`. `SENSEI.md` and `personality.md` are gone.
|
|
8
|
+
|
|
3
9
|
## 1.0.6
|
|
4
10
|
|
|
5
11
|
- Keep phone Later confirmation state private to the app API.
|
|
@@ -5,7 +5,7 @@ export const operation = {
|
|
|
5
5
|
"devices",
|
|
6
6
|
"list"
|
|
7
7
|
],
|
|
8
|
-
"summary": "From a Chat Session: the devices it may ask for, the workspace's devices and the session member's own Macs, each with its id, kind, whether it is online, the tools it offers and this session's access: none, pending or approved. Request one with devices request before any mac command, and use one only when the test truly needs a real Mac.",
|
|
8
|
+
"summary": "From a Chat Session: the devices it may ask for, the workspace's devices and the session member's own Macs, each with its id, kind, whether it is online, the tools it offers and this session's access: none, pending or approved. Pick an online device with the tools the test needs: a workspace device first, and the member's own Mac only when no workspace device fits, whatever the names or past approvals. Request one with devices request before any mac command, and use one only when the test truly needs a real Mac.",
|
|
9
9
|
"pathParams": [],
|
|
10
10
|
"query": [],
|
|
11
11
|
"body": null,
|
|
@@ -5,7 +5,7 @@ export const operation = {
|
|
|
5
5
|
"devices",
|
|
6
6
|
"request"
|
|
7
7
|
],
|
|
8
|
-
"summary": "From a Chat Session: ask to use one device from devices list, with the reason the approver reads on a card in this session's chat. A personal Mac's owner approves it, a workspace device's any workspace admin, once per session: after that, asking again answers approved at once. Answers status pending or approved.
|
|
8
|
+
"summary": "From a Chat Session: ask to use one device from devices list, with the reason the approver reads on a card in this session's chat. A personal Mac's owner approves it, a workspace device's any workspace admin, once per session: after that, asking again answers approved at once. Answers status pending or approved. Check devices list again for the answer; it expires after 30 minutes without an answer. While it is pending, go on with other work; when it is declined or expires, go on without it and say so. Once approved it is yours for the rest of the session: pass --device-id on every mac command.",
|
|
9
9
|
"pathParams": [
|
|
10
10
|
"deviceId"
|
|
11
11
|
],
|
|
@@ -5,7 +5,7 @@ export const operation = {
|
|
|
5
5
|
"integrations",
|
|
6
6
|
"tools"
|
|
7
7
|
],
|
|
8
|
-
"summary": "List the integration tools you can run now, with the connections that run them. An agent reads its own workspace. With an API key, name a workspace you belong to: it shows that workspace’s connections and your own personal ones. Some integrations require an enabled workspace to be named. A Connector Token or a browser session is refused.",
|
|
8
|
+
"summary": "List the integration tools you can run now, with the connections that run them. An agent reads its own workspace. With an API key, name a workspace you belong to: it shows that workspace’s connections and your own personal ones. Some integrations require an enabled workspace to be named. A Connector Token or a browser session is refused. Each toolkit is personal or workspace, never both. A personal connection reaches only a Turn its member started (in a workspace chat, only the session's Assignee); a workspace Cron, Deploy Chat, a Turn another member sent and unassigned work reach workspace connections only. In the Personal space the owner's own Turns reach both kinds.",
|
|
9
9
|
"pathParams": [],
|
|
10
10
|
"query": [
|
|
11
11
|
{
|
|
@@ -5,7 +5,7 @@ export const operation = {
|
|
|
5
5
|
"personal-tasks",
|
|
6
6
|
"create"
|
|
7
7
|
],
|
|
8
|
-
"summary": "File a personal task: yours alone, in no workspace. From a Sensei Turn it joins the Turn’s thread unless threadId names another.",
|
|
8
|
+
"summary": "File a personal task: yours alone, in no workspace. From a Sensei Turn it joins the Turn’s thread unless threadId names another. Check personal-tasks list for one that covers it first.",
|
|
9
9
|
"pathParams": [],
|
|
10
10
|
"query": [],
|
|
11
11
|
"body": {
|
|
@@ -5,7 +5,7 @@ export const operation = {
|
|
|
5
5
|
"personal-tasks",
|
|
6
6
|
"move"
|
|
7
7
|
],
|
|
8
|
-
"summary": "Move a Todo or In progress personal task into a workspace you belong to, as its Todo task assigned to you; the personal task is removed. A due date becomes the description’s last line.",
|
|
8
|
+
"summary": "Move a Todo or In progress personal task into a workspace you belong to, as its Todo task assigned to you; the personal task is removed. A due date becomes the description’s last line. Only when the member asks.",
|
|
9
9
|
"pathParams": [
|
|
10
10
|
"taskId"
|
|
11
11
|
],
|
|
@@ -5,7 +5,7 @@ export const operation = {
|
|
|
5
5
|
"projects",
|
|
6
6
|
"create"
|
|
7
7
|
],
|
|
8
|
-
"summary": "Connect a GitHub repository as a project in a workspace, or describe what to build to create a YOLO project on a new Kosuke-Org repository. Pass workflow yolo with a repository to import it in YOLO mode, with an optional prompt as its first message. Pass personal instead of orgId to create it in your Personal: your own credential, or your Sensei in a Turn you started. Its first Deploy starts by itself, as the caller's; sessions start once it lands. Imports only a repository your own GitHub Connection can write to: 403 GITHUB_REPOSITORY_ACCESS_REQUIRED otherwise, 401 GITHUB_RECONNECT_REQUIRED when GitHub no longer accepts your connection.",
|
|
8
|
+
"summary": "Connect a GitHub repository as a project in a workspace, or describe what to build to create a YOLO project on a new Kosuke-Org repository. Pass workflow yolo with a repository to import it in YOLO mode, with an optional prompt as its first message. Pass personal instead of orgId to create it in your Personal: your own credential, or your Sensei in a Turn you started. Its first Deploy starts by itself, as the caller's; sessions start once it lands. Imports only a repository your own GitHub Connection can write to: 403 GITHUB_REPOSITORY_ACCESS_REQUIRED otherwise, 401 GITHUB_RECONNECT_REQUIRED when GitHub no longer accepts your connection. Pass workflow yolo or personal only when the member asked for it. Report a chatError; on BRANCH_PROTECTED give its message and do not retry.",
|
|
9
9
|
"pathParams": [],
|
|
10
10
|
"query": [],
|
|
11
11
|
"body": {
|
|
@@ -5,7 +5,7 @@ export const operation = {
|
|
|
5
5
|
"projects",
|
|
6
6
|
"skills"
|
|
7
7
|
],
|
|
8
|
-
"summary": "List the skills the agent can invoke in this project, for one provider: the project's own, the workspace's and the member's, the plugins', and Kosuke's own skills in the kosuke plugin, which every chat session carries as kosuke:<name>. From a sandbox, sessionId defaults to its own chat session.",
|
|
8
|
+
"summary": "List the skills the agent can invoke in this project, for one provider: the project's own, the workspace's and the member's, the plugins', and Kosuke's own skills in the kosuke plugin, which every chat session carries as kosuke:<name>. From a sandbox, sessionId defaults to its own chat session. provider is the session's agent: anthropic for Claude, GLM, Kimi and DeepSeek; openai for Codex; meta for Muse; google for Gemini; xai for Grok. Check a skill is listed before you send a message that runs it.",
|
|
9
9
|
"pathParams": [
|
|
10
10
|
"projectId"
|
|
11
11
|
],
|
|
@@ -5,7 +5,7 @@ export const operation = {
|
|
|
5
5
|
"projects",
|
|
6
6
|
"switch-workflow"
|
|
7
7
|
],
|
|
8
|
-
"summary": "Switch a project between YOLO mode and Collaboration. YOLO completes every Active and Under Review session and turns Backlog sessions into Backlog items; switching back revives the sessions it closed.",
|
|
8
|
+
"summary": "Switch a project between YOLO mode and Collaboration. YOLO completes every Active and Under Review session and turns Backlog sessions into Backlog items; switching back revives the sessions it closed. Before a switch to YOLO, list the Active, Under Review and Backlog sessions it closes (`sessions list --status active,under-review,backlog`) and switch only on the member's yes in a later message. A YOLO project's work goes into its one chat, the oldest session not Completed: steer it, or create one when there is none, and never run /kosuke:ship there. A refusal (BRANCH_PROTECTED, TURN_IN_FLIGHT, QUEUED_FILES, BACKLOG_FILES) changed nothing: say it.",
|
|
9
9
|
"pathParams": [
|
|
10
10
|
"projectId"
|
|
11
11
|
],
|
|
@@ -6,7 +6,7 @@ export const operation = {
|
|
|
6
6
|
"messages",
|
|
7
7
|
"send"
|
|
8
8
|
],
|
|
9
|
-
"summary": "Send a message to a member's Sensei. Any sender can: you, your Sensei
|
|
9
|
+
"summary": "Send a message to a member's Sensei. Any sender can: you, your Sensei, a Cron Run, or a session's agent; the sender is read from the credential. Their Sensei shows it on a card that says who sent it, with the action that fits, and they are notified as for any card. Name the project with projectId, and optionally the Chat Session (sessionId) or pull request (pullRequest, with projectId) it is about; a sessionId alone names its project. memberId is required: the id a Member mention carries or `kosuke workspaces members` prints, never a guess between members who share a name. key is a slug such as merge-plan, ticket-<slug> or qa-guide, and text, up to 60,000 characters, is everything the member needs, so it can hold a ticket prompt or a whole Project QA Guide. title, why (one line: why this member), paths (the repository paths it is about) and link (a Kosuke path starting with / or an https URL the card opens) are optional. The same key with new text or a new link updates the open card and raises the revision; the same again writes nothing. Pass ifRevision, the revision an earlier send answered, to be refused with MESSAGE_CHANGED when it moved on. When a member sent it, the recipient's approve, edit, reject or reply comes back to the thread it was sent from. Answers id, revision, updated and the recipient: say who it went to. Keys and text by kind: ticket-<slug of the title>, whose text is \"File the ticket <title> in <project>'s Backlog.\" then the reason and the description; start-<slug>, only for an unassigned or the member's own ticket while nothing of theirs builds or waits on them; delete-<slug> with its evidence; merge-<slug> with the merged text and each task's promptRevision; cron-<slug> with its prompt, crontab and projects; merge-plan with each pull request's number, head SHA and action. Before a ticket message, read the open tasks (`tasks list --include-prompt`): send nothing for work a session already covers, and name the Todo task that covers part of it in text. A 400 VALIDATION_ERROR wrote nothing: fix the fields in details and send again with the same key and memberId. Any other refusal is final: send to nobody else instead. An unknown outcome (a timeout, a 5xx) is never sent again. Pass the body with --body or --body-file.",
|
|
10
10
|
"pathParams": [],
|
|
11
11
|
"query": [],
|
|
12
12
|
"body": {
|
|
@@ -5,7 +5,7 @@ export const operation = {
|
|
|
5
5
|
"sensei",
|
|
6
6
|
"suggest"
|
|
7
7
|
],
|
|
8
|
-
"summary": "Put suggestion pills in a message of your Turn's own thread, under your words. A tap on a pill fills the member's reply and sends nothing; a newThread pill is a new topic, and its tap starts a thread of its own with those words. Refused when your Turn stopped.",
|
|
8
|
+
"summary": "Put suggestion pills in a message of your Turn's own thread, under your words. A tap on a pill fills the member's reply and sends nothing; a newThread pill is a new topic, and its tap starts a thread of its own with those words. Refused when your Turn stopped. Each pill is in the member's words; newThread only for an unrelated topic. It is the last thing your Turn posts: end your Turn after it.",
|
|
9
9
|
"pathParams": [],
|
|
10
10
|
"query": [],
|
|
11
11
|
"body": {
|
|
@@ -6,7 +6,7 @@ export const operation = {
|
|
|
6
6
|
"thread",
|
|
7
7
|
"move"
|
|
8
8
|
],
|
|
9
|
-
"summary": "Move the member’s message that started this Turn’s thread into another of their threads, which it continues. Only Sensei calls it, and only before the Turn has written anything: Kosuke ends this Turn, sends the message into that thread, where it is answered with that thread’s memory, and removes this thread. Write no answer after it.",
|
|
9
|
+
"summary": "Move the member’s message that started this Turn’s thread into another of their threads, which it continues. Only Sensei calls it, and only before the Turn has written anything: Kosuke ends this Turn, sends the message into that thread, where it is answered with that thread’s memory, and removes this thread. Write no answer after it. Move it when it answers a question you asked in that thread, or is about that thread's work or session.",
|
|
10
10
|
"pathParams": [],
|
|
11
11
|
"query": [],
|
|
12
12
|
"body": {
|
|
@@ -6,7 +6,7 @@ export const operation = {
|
|
|
6
6
|
"thread",
|
|
7
7
|
"split"
|
|
8
8
|
],
|
|
9
|
-
"summary": "Split the member’s message that started this Turn’s thread into one thread per ask. Only Sensei calls it, once per message. The member’s message stays the root of this thread, which does the first ask; each other ask becomes a thread of its own with its own Turn. The reply lists the asks handed off: do not do those here.",
|
|
9
|
+
"summary": "Split the member’s message that started this Turn’s thread into one thread per ask. Only Sensei calls it, once per message. The member’s message stays the root of this thread, which does the first ask; each other ask becomes a thread of its own with its own Turn. The reply lists the asks handed off: do not do those here. Each ask stands alone: \"Ship A, B and C\" is three asks, the steps of one piece of work are one.",
|
|
10
10
|
"pathParams": [],
|
|
11
11
|
"query": [],
|
|
12
12
|
"body": {
|
|
@@ -6,7 +6,7 @@ export const operation = {
|
|
|
6
6
|
"artifacts",
|
|
7
7
|
"get"
|
|
8
8
|
],
|
|
9
|
-
"summary": "Read one artifact of the session, by its id or its slug
|
|
9
|
+
"summary": "Read one artifact of the session, by its id or its slug, such as `testing-checklist`, `qa-report` or `review`: a markdown or html one carries its body, an image or a video a presigned url, its media type and its size.",
|
|
10
10
|
"pathParams": [
|
|
11
11
|
"projectId",
|
|
12
12
|
"sessionId",
|
|
@@ -5,7 +5,7 @@ export const operation = {
|
|
|
5
5
|
"sessions",
|
|
6
6
|
"create"
|
|
7
7
|
],
|
|
8
|
-
"summary": "Start a chat session, or file a backlog one with status=backlog. Title or content is required; a backlog session needs content. Attachments ride along as multipart. From a sandbox or a Cron Run, only status=backlog, and reason is required: one line on why the ticket exists. From a Cron Run, Kosuke files it and is its Assignee, and a model the workspace cannot run falls back to the Cron's: model says which one it will run on.",
|
|
8
|
+
"summary": "Start a chat session, or file a backlog one with status=backlog. Title or content is required; a backlog session needs content. Attachments ride along as multipart. From a sandbox or a Cron Run, only status=backlog, and reason is required: one line on why the ticket exists. From a Cron Run, Kosuke files it and is its Assignee, and a model the workspace cannot run falls back to the Cron's: model says which one it will run on. A backlog session answers shareUrl, the link to give for it.",
|
|
9
9
|
"pathParams": [
|
|
10
10
|
"projectId"
|
|
11
11
|
],
|
|
@@ -5,7 +5,7 @@ export const operation = {
|
|
|
5
5
|
"sessions",
|
|
6
6
|
"edit-prompt"
|
|
7
7
|
],
|
|
8
|
-
"summary": "Rewrite the saved prompt of a backlog session, keeping or replacing its attachments. Multipart only. With ifRevision, the promptRevision `sessions get` gave, it is refused with 409 TICKET_EDITED when the prompt changed since; Sensei and a Cron Run must pass it.",
|
|
8
|
+
"summary": "Rewrite the saved prompt of a backlog session, keeping or replacing its attachments. Multipart only. With ifRevision, the promptRevision `sessions get` gave, it is refused with 409 TICKET_EDITED when the prompt changed since; Sensei and a Cron Run must pass it. Send the whole new description, and only for a new goal; an agent rewrites only a ticket it filed unless the member asked.",
|
|
9
9
|
"pathParams": [
|
|
10
10
|
"projectId",
|
|
11
11
|
"sessionId"
|
|
@@ -5,7 +5,7 @@ export const operation = {
|
|
|
5
5
|
"sessions",
|
|
6
6
|
"send"
|
|
7
7
|
],
|
|
8
|
-
"summary": "Send a message: starts a turn, or waits Up next while one is running. To steer the running turn with it, steer the Queued Message it becomes. Attachments ride along as multipart.",
|
|
8
|
+
"summary": "Send a message: starts a turn, or waits Up next while one is running. To steer the running turn with it, steer the Queued Message it becomes. Attachments ride along as multipart. Use it over steer only for attachments, a message that runs a skill, or text over 10,000 characters.",
|
|
9
9
|
"pathParams": [
|
|
10
10
|
"projectId",
|
|
11
11
|
"sessionId"
|
|
@@ -5,7 +5,7 @@ export const operation = {
|
|
|
5
5
|
"sessions",
|
|
6
6
|
"steer"
|
|
7
7
|
],
|
|
8
|
-
"summary": "Send a message and steer it into your running turn. Answers delivery steer, queued (the turn could not take it), job (no turn was running) or refused (the turn was stopped).",
|
|
8
|
+
"summary": "Send a message and steer it into your running turn. Answers delivery steer, queued (the turn could not take it), job (no turn was running) or refused (the turn was stopped). Use it for plain text up to 10,000 characters; on queued or refused, say where the message is.",
|
|
9
9
|
"pathParams": [
|
|
10
10
|
"projectId",
|
|
11
11
|
"sessionId"
|
|
@@ -5,7 +5,7 @@ export const operation = {
|
|
|
5
5
|
"sessions",
|
|
6
6
|
"update"
|
|
7
7
|
],
|
|
8
|
-
"summary": "Change title, status, model, Auto, Assignee, priority, Sandbox size (sandboxSize) or App stack (appStack). Which changes are legal depends on the current status; the handler decides. sandboxSize and appStack change only while the session is in the Backlog: once it started they are fixed, and 409 SANDBOX_SETTINGS_LOCKED refuses them.",
|
|
8
|
+
"summary": "Change title, status, model, Auto, Assignee, priority, Sandbox size (sandboxSize) or App stack (appStack). Which changes are legal depends on the current status; the handler decides. sandboxSize and appStack change only while the session is in the Backlog: once it started they are fixed, and 409 SANDBOX_SETTINGS_LOCKED refuses them. A sandbox or a Cron Run may change only the title and priority of a Backlog session it filed.",
|
|
9
9
|
"pathParams": [
|
|
10
10
|
"projectId",
|
|
11
11
|
"sessionId"
|
|
@@ -5,7 +5,7 @@ export const operation = {
|
|
|
5
5
|
"tasks",
|
|
6
6
|
"all"
|
|
7
7
|
],
|
|
8
|
-
"summary": "List tasks across your workspaces. Agent credentials stay in their workspace. includeOpenCount counts Todo and In progress with the same filters, independent of status and cursor.",
|
|
8
|
+
"summary": "List tasks across your workspaces. Agent credentials stay in their workspace. includeOpenCount counts Todo and In progress with the same filters, independent of status and cursor. Before you file or propose a ticket, read the open ones (--status todo,in_progress --include-prompt, following meta.pagination.nextCursor with --cursor) and judge overlap by meaning, not title words: work another task or session already covers gets no new ticket.",
|
|
9
9
|
"pathParams": [],
|
|
10
10
|
"query": [
|
|
11
11
|
{
|
|
@@ -85,7 +85,8 @@ export const operation = {
|
|
|
85
85
|
"name": "includePrompt",
|
|
86
86
|
"flag": "include-prompt",
|
|
87
87
|
"kind": "boolean",
|
|
88
|
-
"required": false
|
|
88
|
+
"required": false,
|
|
89
|
+
"description": "Adds each task's prompt: a Todo task's description, or its first message after Start, cut at 4,000 characters (promptTruncated). Read `tasks get` for a cut or empty one."
|
|
89
90
|
},
|
|
90
91
|
{
|
|
91
92
|
"name": "includeOpenCount",
|
|
@@ -5,7 +5,7 @@ export const operation = {
|
|
|
5
5
|
"tasks",
|
|
6
6
|
"create"
|
|
7
7
|
],
|
|
8
|
-
"summary": "File a task. A hint files into that project; YOLO returns a Backlog item.",
|
|
8
|
+
"summary": "File a task. A hint files into that project; YOLO returns a Backlog item. From Sensei, ownerId is the member, or the teammate they name; leave sandboxSize to the member, who changes it in the task's Properties. Answers shareUrl: link the task's title to it.",
|
|
9
9
|
"pathParams": [
|
|
10
10
|
"workspaceId"
|
|
11
11
|
],
|
|
@@ -106,7 +106,8 @@ export const operation = {
|
|
|
106
106
|
"name": "description",
|
|
107
107
|
"flag": "description",
|
|
108
108
|
"kind": "string",
|
|
109
|
-
"required": true
|
|
109
|
+
"required": true,
|
|
110
|
+
"description": "Markdown someone with none of your context can act on: the goal, why it matters, the limits, what done contains, and what the repository does not hold (a log line, an error, a URL). Resolve every \"it\" and @mention; keep the member's decisions and scope; leave out empty sections."
|
|
110
111
|
},
|
|
111
112
|
{
|
|
112
113
|
"name": "hintProjectId",
|
|
@@ -235,7 +236,8 @@ export const operation = {
|
|
|
235
236
|
"name": "description",
|
|
236
237
|
"flag": "description",
|
|
237
238
|
"kind": "string",
|
|
238
|
-
"required": true
|
|
239
|
+
"required": true,
|
|
240
|
+
"description": "Markdown someone with none of your context can act on: the goal, why it matters, the limits, what done contains, and what the repository does not hold (a log line, an error, a URL). Resolve every \"it\" and @mention; keep the member's decisions and scope; leave out empty sections."
|
|
239
241
|
},
|
|
240
242
|
{
|
|
241
243
|
"name": "hintProjectId",
|
|
@@ -5,7 +5,7 @@ export const operation = {
|
|
|
5
5
|
"tasks",
|
|
6
6
|
"list"
|
|
7
7
|
],
|
|
8
|
-
"summary": "List tasks in one workspace.",
|
|
8
|
+
"summary": "List tasks in one workspace. Before you file or propose a ticket, read the open ones (--status todo,in_progress --include-prompt, following meta.pagination.nextCursor with --cursor) and judge overlap by meaning, not title words: work another task or session already covers gets no new ticket.",
|
|
9
9
|
"pathParams": [
|
|
10
10
|
"workspaceId"
|
|
11
11
|
],
|
|
@@ -87,7 +87,8 @@ export const operation = {
|
|
|
87
87
|
"name": "includePrompt",
|
|
88
88
|
"flag": "include-prompt",
|
|
89
89
|
"kind": "boolean",
|
|
90
|
-
"required": false
|
|
90
|
+
"required": false,
|
|
91
|
+
"description": "Adds each task's prompt: a Todo task's description, or its first message after Start, cut at 4,000 characters (promptTruncated). Read `tasks get` for a cut or empty one."
|
|
91
92
|
},
|
|
92
93
|
{
|
|
93
94
|
"name": "includeOpenCount",
|
|
@@ -5,7 +5,7 @@ export const operation = {
|
|
|
5
5
|
"tasks",
|
|
6
6
|
"start"
|
|
7
7
|
],
|
|
8
|
-
"summary": "Start a Todo task. Members and Sensei only. sandboxSize and appStack set the task's Sandbox size and App stack as it starts; absent keeps what the task holds.",
|
|
8
|
+
"summary": "Start a Todo task. Members and Sensei only. sandboxSize and appStack set the task's Sandbox size and App stack as it starts; absent keeps what the task holds. The member's ask to start is the yes: start without reading back credits or sandboxes. A refusal leaves it in the Backlog: say what Kosuke answered and do not retry.",
|
|
9
9
|
"pathParams": [
|
|
10
10
|
"workspaceId",
|
|
11
11
|
"taskId"
|
|
@@ -32,7 +32,8 @@ export const operation = {
|
|
|
32
32
|
"name": "prompt",
|
|
33
33
|
"flag": "prompt",
|
|
34
34
|
"kind": "string",
|
|
35
|
-
"required": false
|
|
35
|
+
"required": false,
|
|
36
|
+
"description": "Other text for the first message. The description stays as it is."
|
|
36
37
|
},
|
|
37
38
|
{
|
|
38
39
|
"name": "sandboxSize",
|
|
@@ -124,13 +124,15 @@ export const operation = {
|
|
|
124
124
|
"name": "description",
|
|
125
125
|
"flag": "description",
|
|
126
126
|
"kind": "string",
|
|
127
|
-
"required": false
|
|
127
|
+
"required": false,
|
|
128
|
+
"description": "The whole new description, only when the goal changed: never because the task starts."
|
|
128
129
|
},
|
|
129
130
|
{
|
|
130
131
|
"name": "ifRevision",
|
|
131
132
|
"flag": "if-revision",
|
|
132
133
|
"kind": "string",
|
|
133
|
-
"required": false
|
|
134
|
+
"required": false,
|
|
135
|
+
"description": "The descriptionRevision `tasks get` printed. Sensei and a Cron Run must pass it with description; a changed task answers 409 TASK_CONFLICT, so read it again and reconcile."
|
|
134
136
|
},
|
|
135
137
|
{
|
|
136
138
|
"name": "hintProjectId",
|
|
@@ -6,7 +6,7 @@ export const operation = {
|
|
|
6
6
|
"crons",
|
|
7
7
|
"create"
|
|
8
8
|
],
|
|
9
|
-
"summary": "Create a Personal Cron, enabled, with you as its owner. A Personal Cron belongs to you and no workspace: with Personal Repositories or Apps it runs in its own sandbox; without, in its Sensei Thread. Repository runs use your own Subscriptions; thread runs use your Subscriptions or Kosuke free when you hold none. Kosuke free cannot run a Cron with repositories yet. The crontab is read in the cron's own timezone, and may not fire more often than every 15 minutes. The model is an encoded id such as anthropic:opus__xhigh; repositories require an explicit Model from any released Provider on one of your Subscriptions. Changing to Free while you hold a Subscription, or to a personal Model without one, is refused. Without repositories, null or left out runs on the thread’s model. From your Sensei it is refused with 409 CRON_ALREADY_EXISTS when you have a Personal Cron by that name.",
|
|
9
|
+
"summary": "Create a Personal Cron, enabled, with you as its owner. A Personal Cron belongs to you and no workspace: with Personal Repositories or Apps it runs in its own sandbox; without, in its Sensei Thread. Repository runs use your own Subscriptions; thread runs use your Subscriptions or Kosuke free when you hold none. Kosuke free cannot run a Cron with repositories yet. The crontab is read in the cron's own timezone, and may not fire more often than every 15 minutes. The model is an encoded id such as anthropic:opus__xhigh; repositories require an explicit Model from any released Provider on one of your Subscriptions. Changing to Free while you hold a Subscription, or to a personal Model without one, is refused. Without repositories, null or left out runs on the thread’s model. From your Sensei it is refused with 409 CRON_ALREADY_EXISTS when you have a Personal Cron by that name: update that one instead. From Sensei, create or change one only when the member asks. To move a workspace Cron here, read it and recreate it with its timezone (its model only when the member's own Subscription runs it); the member deletes the workspace one in the app.",
|
|
10
10
|
"pathParams": [],
|
|
11
11
|
"query": [],
|
|
12
12
|
"body": {
|
|
@@ -11,14 +11,8 @@ export const AGENT_TOKENS = [
|
|
|
11
11
|
{ token: 'sandboxToken', prefixes: ['kosuke_sbx_'], extension: 'x-kosuke-sandbox-token' },
|
|
12
12
|
// Wire contract with `src/lib/auth/cron-token.ts`: one Cron Run.
|
|
13
13
|
{ token: 'cronToken', prefixes: ['kosuke_crn_'], extension: 'x-kosuke-cron-token' },
|
|
14
|
-
// Wire contract with `src/lib/auth/sensei-token.ts`: a Sensei Chat's Turn.
|
|
15
|
-
|
|
16
|
-
// release after the rename.
|
|
17
|
-
{
|
|
18
|
-
token: 'senseiToken',
|
|
19
|
-
prefixes: ['kosuke_sensei_', 'kosuke_lead_'],
|
|
20
|
-
extension: 'x-kosuke-sensei-token',
|
|
21
|
-
},
|
|
14
|
+
// Wire contract with `src/lib/auth/sensei-token.ts`: a Sensei Chat's Turn.
|
|
15
|
+
{ token: 'senseiToken', prefixes: ['kosuke_sensei_'], extension: 'x-kosuke-sensei-token' },
|
|
22
16
|
];
|
|
23
17
|
/** The agent token a key is, by its prefix; null for a member's own key or none. */
|
|
24
18
|
export function agentTokenOf(key) {
|
package/dist/runtime/attach.js
CHANGED
|
@@ -7,36 +7,12 @@ import { buildRequest, execute, readWholeBody, UsageError } from './invoke.js';
|
|
|
7
7
|
* the contract's summary, verbatim.
|
|
8
8
|
*/
|
|
9
9
|
export function attachOperation(root, operation, runtime) {
|
|
10
|
-
|
|
11
|
-
const name = operation.command.join(' ');
|
|
12
|
-
for (const [alias, target] of COMMAND_ALIASES) {
|
|
13
|
-
if (target === name) {
|
|
14
|
-
attachLeaf(root, alias.split(' '), operation, runtime, {
|
|
15
|
-
hidden: true,
|
|
16
|
-
workspaceArgument: true,
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
return leaf;
|
|
10
|
+
return attachLeaf(root, operation.command, operation, runtime);
|
|
21
11
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
// person. The workspace they take goes to `--workspace` where the command reads one.
|
|
26
|
-
const COMMAND_ALIASES = new Map([
|
|
27
|
-
['cards', 'sensei cards'],
|
|
28
|
-
['merge', 'sensei merge'],
|
|
29
|
-
['notifications open', 'sensei notifications open'],
|
|
30
|
-
].flatMap(([old, target]) => [
|
|
31
|
-
[`workspaces sensei-${old}`, target],
|
|
32
|
-
[`workspaces lead-${old}`, target],
|
|
33
|
-
]));
|
|
34
|
-
function attachLeaf(root, path, operation, runtime, { hidden, workspaceArgument = false }) {
|
|
35
|
-
const parent = groupFor(root, path.slice(0, -1), { hidden });
|
|
36
|
-
const leaf = parent.command(path[path.length - 1], { hidden });
|
|
12
|
+
function attachLeaf(root, path, operation, runtime) {
|
|
13
|
+
const parent = groupFor(root, path.slice(0, -1));
|
|
14
|
+
const leaf = parent.command(path[path.length - 1]);
|
|
37
15
|
leaf.description(operation.summary);
|
|
38
|
-
if (workspaceArgument)
|
|
39
|
-
leaf.addArgument(new Argument('<workspaceId>', 'Workspace id'));
|
|
40
16
|
for (const name of operation.pathParams) {
|
|
41
17
|
leaf.addArgument(new Argument(`<${name}>`, humanize(name)));
|
|
42
18
|
}
|
|
@@ -63,17 +39,10 @@ function attachLeaf(root, path, operation, runtime, { hidden, workspaceArgument
|
|
|
63
39
|
}
|
|
64
40
|
leaf.action(async (...args) => {
|
|
65
41
|
const options = args[args.length - 2];
|
|
66
|
-
const
|
|
67
|
-
const positionals = args.slice(offset, offset + operation.pathParams.length);
|
|
68
|
-
const workspace = workspaceArgument ? args[0] : undefined;
|
|
42
|
+
const positionals = args.slice(0, operation.pathParams.length);
|
|
69
43
|
const input = {
|
|
70
44
|
pathParams: Object.fromEntries(operation.pathParams.map((name, i) => [name, positionals[i]])),
|
|
71
|
-
fields: Object.fromEntries(fields.map((field) =>
|
|
72
|
-
const given = options[optionKey(field.flag)];
|
|
73
|
-
// The old command's workspace filters a read that takes one; a write names its own.
|
|
74
|
-
const value = given ?? (field.name === 'workspace' ? workspace : undefined);
|
|
75
|
-
return [field.name, value];
|
|
76
|
-
})),
|
|
45
|
+
fields: Object.fromEntries(fields.map((field) => [field.name, options[optionKey(field.flag)]])),
|
|
77
46
|
wholeBody: readWholeBody({
|
|
78
47
|
body: options.body,
|
|
79
48
|
bodyFile: options.bodyFile,
|
|
@@ -98,13 +67,11 @@ function attachLeaf(root, path, operation, runtime, { hidden, workspaceArgument
|
|
|
98
67
|
});
|
|
99
68
|
return leaf;
|
|
100
69
|
}
|
|
101
|
-
|
|
102
|
-
export function groupFor(root, path, { hidden = false } = {}) {
|
|
70
|
+
export function groupFor(root, path) {
|
|
103
71
|
let current = root;
|
|
104
72
|
for (const segment of path) {
|
|
105
73
|
const existing = current.commands.find((command) => command.name() === segment);
|
|
106
|
-
current =
|
|
107
|
-
existing ?? current.command(segment, { hidden }).description(`${humanize(segment)} commands`);
|
|
74
|
+
current = existing ?? current.command(segment).description(`${humanize(segment)} commands`);
|
|
108
75
|
}
|
|
109
76
|
return current;
|
|
110
77
|
}
|
package/openapi.json
CHANGED
|
@@ -234,7 +234,7 @@
|
|
|
234
234
|
"/api/agent-integrations/tools": {
|
|
235
235
|
"get": {
|
|
236
236
|
"operationId": "integrationsTools",
|
|
237
|
-
"summary": "List the integration tools you can run now, with the connections that run them. An agent reads its own workspace. With an API key, name a workspace you belong to: it shows that workspace’s connections and your own personal ones. Some integrations require an enabled workspace to be named. A Connector Token or a browser session is refused.",
|
|
237
|
+
"summary": "List the integration tools you can run now, with the connections that run them. An agent reads its own workspace. With an API key, name a workspace you belong to: it shows that workspace’s connections and your own personal ones. Some integrations require an enabled workspace to be named. A Connector Token or a browser session is refused. Each toolkit is personal or workspace, never both. A personal connection reaches only a Turn its member started (in a workspace chat, only the session's Assignee); a workspace Cron, Deploy Chat, a Turn another member sent and unassigned work reach workspace connections only. In the Personal space the owner's own Turns reach both kinds.",
|
|
238
238
|
"tags": ["integrations"],
|
|
239
239
|
"x-kosuke-command": ["integrations", "tools"],
|
|
240
240
|
"x-kosuke-sandbox-token": true,
|
|
@@ -766,7 +766,7 @@
|
|
|
766
766
|
"/api/devices/{deviceId}/requests": {
|
|
767
767
|
"post": {
|
|
768
768
|
"operationId": "devicesRequest",
|
|
769
|
-
"summary": "From a Chat Session: ask to use one device from devices list, with the reason the approver reads on a card in this session's chat. A personal Mac's owner approves it, a workspace device's any workspace admin, once per session: after that, asking again answers approved at once. Answers status pending or approved.
|
|
769
|
+
"summary": "From a Chat Session: ask to use one device from devices list, with the reason the approver reads on a card in this session's chat. A personal Mac's owner approves it, a workspace device's any workspace admin, once per session: after that, asking again answers approved at once. Answers status pending or approved. Check devices list again for the answer; it expires after 30 minutes without an answer. While it is pending, go on with other work; when it is declined or expires, go on without it and say so. Once approved it is yours for the rest of the session: pass --device-id on every mac command.",
|
|
770
770
|
"tags": ["devices"],
|
|
771
771
|
"x-kosuke-command": ["devices", "request"],
|
|
772
772
|
"x-kosuke-sandbox-token": true,
|
|
@@ -837,7 +837,7 @@
|
|
|
837
837
|
"/api/devices/available": {
|
|
838
838
|
"get": {
|
|
839
839
|
"operationId": "devicesList",
|
|
840
|
-
"summary": "From a Chat Session: the devices it may ask for, the workspace's devices and the session member's own Macs, each with its id, kind, whether it is online, the tools it offers and this session's access: none, pending or approved. Request one with devices request before any mac command, and use one only when the test truly needs a real Mac.",
|
|
840
|
+
"summary": "From a Chat Session: the devices it may ask for, the workspace's devices and the session member's own Macs, each with its id, kind, whether it is online, the tools it offers and this session's access: none, pending or approved. Pick an online device with the tools the test needs: a workspace device first, and the member's own Mac only when no workspace device fits, whatever the names or past approvals. Request one with devices request before any mac command, and use one only when the test truly needs a real Mac.",
|
|
841
841
|
"tags": ["devices"],
|
|
842
842
|
"x-kosuke-command": ["devices", "list"],
|
|
843
843
|
"x-kosuke-sandbox-token": true,
|
|
@@ -7865,7 +7865,7 @@
|
|
|
7865
7865
|
"/api/organizations/{workspaceId}/tasks": {
|
|
7866
7866
|
"get": {
|
|
7867
7867
|
"operationId": "tasksList",
|
|
7868
|
-
"summary": "List tasks in one workspace.",
|
|
7868
|
+
"summary": "List tasks in one workspace. Before you file or propose a ticket, read the open ones (--status todo,in_progress --include-prompt, following meta.pagination.nextCursor with --cursor) and judge overlap by meaning, not title words: work another task or session already covers gets no new ticket.",
|
|
7869
7869
|
"tags": ["tasks"],
|
|
7870
7870
|
"x-kosuke-command": ["tasks", "list"],
|
|
7871
7871
|
"x-kosuke-sandbox-token": true,
|
|
@@ -7986,7 +7986,9 @@
|
|
|
7986
7986
|
"name": "includePrompt",
|
|
7987
7987
|
"in": "query",
|
|
7988
7988
|
"required": false,
|
|
7989
|
+
"description": "Adds each task's prompt: a Todo task's description, or its first message after Start, cut at 4,000 characters (promptTruncated). Read `tasks get` for a cut or empty one.",
|
|
7989
7990
|
"schema": {
|
|
7991
|
+
"description": "Adds each task's prompt: a Todo task's description, or its first message after Start, cut at 4,000 characters (promptTruncated). Read `tasks get` for a cut or empty one.",
|
|
7990
7992
|
"type": "boolean"
|
|
7991
7993
|
}
|
|
7992
7994
|
},
|
|
@@ -8043,7 +8045,7 @@
|
|
|
8043
8045
|
},
|
|
8044
8046
|
"post": {
|
|
8045
8047
|
"operationId": "tasksCreate",
|
|
8046
|
-
"summary": "File a task. A hint files into that project; YOLO returns a Backlog item.",
|
|
8048
|
+
"summary": "File a task. A hint files into that project; YOLO returns a Backlog item. From Sensei, ownerId is the member, or the teammate they name; leave sandboxSize to the member, who changes it in the task's Properties. Answers shareUrl: link the task's title to it.",
|
|
8047
8049
|
"tags": ["tasks"],
|
|
8048
8050
|
"x-kosuke-command": ["tasks", "create"],
|
|
8049
8051
|
"x-kosuke-attachments": true,
|
|
@@ -8121,7 +8123,8 @@
|
|
|
8121
8123
|
"description": "start (default) runs the project's services when the sandbox boots. skip boots setup and the agent only; a member or the session's agent starts the services later with sessions app-stack-start. Fixed once the session starts."
|
|
8122
8124
|
},
|
|
8123
8125
|
"description": {
|
|
8124
|
-
"type": "string"
|
|
8126
|
+
"type": "string",
|
|
8127
|
+
"description": "Markdown someone with none of your context can act on: the goal, why it matters, the limits, what done contains, and what the repository does not hold (a log line, an error, a URL). Resolve every \"it\" and @mention; keep the member's decisions and scope; leave out empty sections."
|
|
8125
8128
|
},
|
|
8126
8129
|
"hintProjectId": {
|
|
8127
8130
|
"x-kosuke-flag": "hint-project",
|
|
@@ -8202,7 +8205,8 @@
|
|
|
8202
8205
|
"description": "start (default) runs the project's services when the sandbox boots. skip boots setup and the agent only; a member or the session's agent starts the services later with sessions app-stack-start. Fixed once the session starts."
|
|
8203
8206
|
},
|
|
8204
8207
|
"description": {
|
|
8205
|
-
"type": "string"
|
|
8208
|
+
"type": "string",
|
|
8209
|
+
"description": "Markdown someone with none of your context can act on: the goal, why it matters, the limits, what done contains, and what the repository does not hold (a log line, an error, a URL). Resolve every \"it\" and @mention; keep the member's decisions and scope; leave out empty sections."
|
|
8206
8210
|
},
|
|
8207
8211
|
"hintProjectId": {
|
|
8208
8212
|
"x-kosuke-flag": "hint-project",
|
|
@@ -8491,9 +8495,11 @@
|
|
|
8491
8495
|
]
|
|
8492
8496
|
},
|
|
8493
8497
|
"description": {
|
|
8498
|
+
"description": "The whole new description, only when the goal changed: never because the task starts.",
|
|
8494
8499
|
"type": "string"
|
|
8495
8500
|
},
|
|
8496
8501
|
"ifRevision": {
|
|
8502
|
+
"description": "The descriptionRevision `tasks get` printed. Sensei and a Cron Run must pass it with description; a changed task answers 409 TASK_CONFLICT, so read it again and reconcile.",
|
|
8497
8503
|
"type": "string"
|
|
8498
8504
|
},
|
|
8499
8505
|
"hintProjectId": {
|
|
@@ -8689,7 +8695,7 @@
|
|
|
8689
8695
|
"/api/organizations/{workspaceId}/tasks/{taskId}/start": {
|
|
8690
8696
|
"post": {
|
|
8691
8697
|
"operationId": "tasksStart",
|
|
8692
|
-
"summary": "Start a Todo task. Members and Sensei only. sandboxSize and appStack set the task's Sandbox size and App stack as it starts; absent keeps what the task holds.",
|
|
8698
|
+
"summary": "Start a Todo task. Members and Sensei only. sandboxSize and appStack set the task's Sandbox size and App stack as it starts; absent keeps what the task holds. The member's ask to start is the yes: start without reading back credits or sandboxes. A refusal leaves it in the Backlog: say what Kosuke answered and do not retry.",
|
|
8693
8699
|
"tags": ["tasks"],
|
|
8694
8700
|
"x-kosuke-command": ["tasks", "start"],
|
|
8695
8701
|
"x-kosuke-sandbox-token": true,
|
|
@@ -8733,6 +8739,7 @@
|
|
|
8733
8739
|
"enum": ["ship"]
|
|
8734
8740
|
},
|
|
8735
8741
|
"prompt": {
|
|
8742
|
+
"description": "Other text for the first message. The description stays as it is.",
|
|
8736
8743
|
"type": "string"
|
|
8737
8744
|
},
|
|
8738
8745
|
"sandboxSize": {
|
|
@@ -9049,7 +9056,7 @@
|
|
|
9049
9056
|
},
|
|
9050
9057
|
"post": {
|
|
9051
9058
|
"operationId": "personalTasksCreate",
|
|
9052
|
-
"summary": "File a personal task: yours alone, in no workspace. From a Sensei Turn it joins the Turn’s thread unless threadId names another.",
|
|
9059
|
+
"summary": "File a personal task: yours alone, in no workspace. From a Sensei Turn it joins the Turn’s thread unless threadId names another. Check personal-tasks list for one that covers it first.",
|
|
9053
9060
|
"tags": ["personal-tasks"],
|
|
9054
9061
|
"x-kosuke-command": ["personal-tasks", "create"],
|
|
9055
9062
|
"x-kosuke-sandbox-token": true,
|
|
@@ -9353,7 +9360,7 @@
|
|
|
9353
9360
|
"/api/personal-tasks/{taskId}/move": {
|
|
9354
9361
|
"post": {
|
|
9355
9362
|
"operationId": "personalTasksMove",
|
|
9356
|
-
"summary": "Move a Todo or In progress personal task into a workspace you belong to, as its Todo task assigned to you; the personal task is removed. A due date becomes the description’s last line.",
|
|
9363
|
+
"summary": "Move a Todo or In progress personal task into a workspace you belong to, as its Todo task assigned to you; the personal task is removed. A due date becomes the description’s last line. Only when the member asks.",
|
|
9357
9364
|
"tags": ["personal-tasks"],
|
|
9358
9365
|
"x-kosuke-command": ["personal-tasks", "move"],
|
|
9359
9366
|
"x-kosuke-sandbox-token": true,
|
|
@@ -9461,6 +9468,7 @@
|
|
|
9461
9468
|
"enum": ["ship"]
|
|
9462
9469
|
},
|
|
9463
9470
|
"prompt": {
|
|
9471
|
+
"description": "Other text for the first message. The description stays as it is.",
|
|
9464
9472
|
"type": "string"
|
|
9465
9473
|
},
|
|
9466
9474
|
"sandboxSize": {
|
|
@@ -9557,7 +9565,7 @@
|
|
|
9557
9565
|
},
|
|
9558
9566
|
"post": {
|
|
9559
9567
|
"operationId": "projectsCreate",
|
|
9560
|
-
"summary": "Connect a GitHub repository as a project in a workspace, or describe what to build to create a YOLO project on a new Kosuke-Org repository. Pass workflow yolo with a repository to import it in YOLO mode, with an optional prompt as its first message. Pass personal instead of orgId to create it in your Personal: your own credential, or your Sensei in a Turn you started. Its first Deploy starts by itself, as the caller's; sessions start once it lands. Imports only a repository your own GitHub Connection can write to: 403 GITHUB_REPOSITORY_ACCESS_REQUIRED otherwise, 401 GITHUB_RECONNECT_REQUIRED when GitHub no longer accepts your connection.",
|
|
9568
|
+
"summary": "Connect a GitHub repository as a project in a workspace, or describe what to build to create a YOLO project on a new Kosuke-Org repository. Pass workflow yolo with a repository to import it in YOLO mode, with an optional prompt as its first message. Pass personal instead of orgId to create it in your Personal: your own credential, or your Sensei in a Turn you started. Its first Deploy starts by itself, as the caller's; sessions start once it lands. Imports only a repository your own GitHub Connection can write to: 403 GITHUB_REPOSITORY_ACCESS_REQUIRED otherwise, 401 GITHUB_RECONNECT_REQUIRED when GitHub no longer accepts your connection. Pass workflow yolo or personal only when the member asked for it. Report a chatError; on BRANCH_PROTECTED give its message and do not retry.",
|
|
9561
9569
|
"tags": ["projects"],
|
|
9562
9570
|
"x-kosuke-command": ["projects", "create"],
|
|
9563
9571
|
"x-kosuke-sandbox-token": true,
|
|
@@ -10801,7 +10809,7 @@
|
|
|
10801
10809
|
},
|
|
10802
10810
|
"post": {
|
|
10803
10811
|
"operationId": "sessionsCreate",
|
|
10804
|
-
"summary": "Start a chat session, or file a backlog one with status=backlog. Title or content is required; a backlog session needs content. Attachments ride along as multipart. From a sandbox or a Cron Run, only status=backlog, and reason is required: one line on why the ticket exists. From a Cron Run, Kosuke files it and is its Assignee, and a model the workspace cannot run falls back to the Cron's: model says which one it will run on.",
|
|
10812
|
+
"summary": "Start a chat session, or file a backlog one with status=backlog. Title or content is required; a backlog session needs content. Attachments ride along as multipart. From a sandbox or a Cron Run, only status=backlog, and reason is required: one line on why the ticket exists. From a Cron Run, Kosuke files it and is its Assignee, and a model the workspace cannot run falls back to the Cron's: model says which one it will run on. A backlog session answers shareUrl, the link to give for it.",
|
|
10805
10813
|
"tags": ["sessions"],
|
|
10806
10814
|
"x-kosuke-command": ["sessions", "create"],
|
|
10807
10815
|
"x-kosuke-attachments": true,
|
|
@@ -11057,7 +11065,7 @@
|
|
|
11057
11065
|
},
|
|
11058
11066
|
"put": {
|
|
11059
11067
|
"operationId": "sessionsUpdate",
|
|
11060
|
-
"summary": "Change title, status, model, Auto, Assignee, priority, Sandbox size (sandboxSize) or App stack (appStack). Which changes are legal depends on the current status; the handler decides. sandboxSize and appStack change only while the session is in the Backlog: once it started they are fixed, and 409 SANDBOX_SETTINGS_LOCKED refuses them.",
|
|
11068
|
+
"summary": "Change title, status, model, Auto, Assignee, priority, Sandbox size (sandboxSize) or App stack (appStack). Which changes are legal depends on the current status; the handler decides. sandboxSize and appStack change only while the session is in the Backlog: once it started they are fixed, and 409 SANDBOX_SETTINGS_LOCKED refuses them. A sandbox or a Cron Run may change only the title and priority of a Backlog session it filed.",
|
|
11061
11069
|
"tags": ["sessions"],
|
|
11062
11070
|
"x-kosuke-command": ["sessions", "update"],
|
|
11063
11071
|
"x-kosuke-sandbox-token": true,
|
|
@@ -11528,7 +11536,7 @@
|
|
|
11528
11536
|
"/api/projects/{projectId}/chat-sessions/{sessionId}/artifacts/{artifactId}": {
|
|
11529
11537
|
"get": {
|
|
11530
11538
|
"operationId": "sessionsArtifactsGet",
|
|
11531
|
-
"summary": "Read one artifact of the session, by its id or its slug
|
|
11539
|
+
"summary": "Read one artifact of the session, by its id or its slug, such as `testing-checklist`, `qa-report` or `review`: a markdown or html one carries its body, an image or a video a presigned url, its media type and its size.",
|
|
11532
11540
|
"tags": ["sessions"],
|
|
11533
11541
|
"x-kosuke-command": ["sessions", "artifacts", "get"],
|
|
11534
11542
|
"x-kosuke-sandbox-token": true,
|
|
@@ -12052,7 +12060,7 @@
|
|
|
12052
12060
|
},
|
|
12053
12061
|
"post": {
|
|
12054
12062
|
"operationId": "sessionsSend",
|
|
12055
|
-
"summary": "Send a message: starts a turn, or waits Up next while one is running. To steer the running turn with it, steer the Queued Message it becomes. Attachments ride along as multipart.",
|
|
12063
|
+
"summary": "Send a message: starts a turn, or waits Up next while one is running. To steer the running turn with it, steer the Queued Message it becomes. Attachments ride along as multipart. Use it over steer only for attachments, a message that runs a skill, or text over 10,000 characters.",
|
|
12056
12064
|
"tags": ["sessions"],
|
|
12057
12065
|
"x-kosuke-command": ["sessions", "send"],
|
|
12058
12066
|
"x-kosuke-attachments": true,
|
|
@@ -14045,7 +14053,7 @@
|
|
|
14045
14053
|
"/api/projects/{projectId}/chat-sessions/{sessionId}/prompt": {
|
|
14046
14054
|
"patch": {
|
|
14047
14055
|
"operationId": "sessionsEditPrompt",
|
|
14048
|
-
"summary": "Rewrite the saved prompt of a backlog session, keeping or replacing its attachments. Multipart only. With ifRevision, the promptRevision `sessions get` gave, it is refused with 409 TICKET_EDITED when the prompt changed since; Sensei and a Cron Run must pass it.",
|
|
14056
|
+
"summary": "Rewrite the saved prompt of a backlog session, keeping or replacing its attachments. Multipart only. With ifRevision, the promptRevision `sessions get` gave, it is refused with 409 TICKET_EDITED when the prompt changed since; Sensei and a Cron Run must pass it. Send the whole new description, and only for a new goal; an agent rewrites only a ticket it filed unless the member asked.",
|
|
14049
14057
|
"tags": ["sessions"],
|
|
14050
14058
|
"x-kosuke-command": ["sessions", "edit-prompt"],
|
|
14051
14059
|
"x-kosuke-attachments": true,
|
|
@@ -15016,7 +15024,7 @@
|
|
|
15016
15024
|
"/api/projects/{projectId}/chat-sessions/{sessionId}/steer": {
|
|
15017
15025
|
"post": {
|
|
15018
15026
|
"operationId": "sessionsSteer",
|
|
15019
|
-
"summary": "Send a message and steer it into your running turn. Answers delivery steer, queued (the turn could not take it), job (no turn was running) or refused (the turn was stopped).",
|
|
15027
|
+
"summary": "Send a message and steer it into your running turn. Answers delivery steer, queued (the turn could not take it), job (no turn was running) or refused (the turn was stopped). Use it for plain text up to 10,000 characters; on queued or refused, say where the message is.",
|
|
15020
15028
|
"tags": ["sessions"],
|
|
15021
15029
|
"x-kosuke-command": ["sessions", "steer"],
|
|
15022
15030
|
"x-kosuke-sandbox-token": true,
|
|
@@ -18579,7 +18587,7 @@
|
|
|
18579
18587
|
"/api/projects/{projectId}/skills": {
|
|
18580
18588
|
"get": {
|
|
18581
18589
|
"operationId": "projectsSkills",
|
|
18582
|
-
"summary": "List the skills the agent can invoke in this project, for one provider: the project's own, the workspace's and the member's, the plugins', and Kosuke's own skills in the kosuke plugin, which every chat session carries as kosuke:<name>. From a sandbox, sessionId defaults to its own chat session.",
|
|
18590
|
+
"summary": "List the skills the agent can invoke in this project, for one provider: the project's own, the workspace's and the member's, the plugins', and Kosuke's own skills in the kosuke plugin, which every chat session carries as kosuke:<name>. From a sandbox, sessionId defaults to its own chat session. provider is the session's agent: anthropic for Claude, GLM, Kimi and DeepSeek; openai for Codex; meta for Muse; google for Gemini; xai for Grok. Check a skill is listed before you send a message that runs it.",
|
|
18583
18591
|
"tags": ["projects"],
|
|
18584
18592
|
"x-kosuke-command": ["projects", "skills"],
|
|
18585
18593
|
"x-kosuke-sandbox-token": true,
|
|
@@ -18710,7 +18718,7 @@
|
|
|
18710
18718
|
"/api/projects/{projectId}/workflow": {
|
|
18711
18719
|
"post": {
|
|
18712
18720
|
"operationId": "projectsSwitchWorkflow",
|
|
18713
|
-
"summary": "Switch a project between YOLO mode and Collaboration. YOLO completes every Active and Under Review session and turns Backlog sessions into Backlog items; switching back revives the sessions it closed.",
|
|
18721
|
+
"summary": "Switch a project between YOLO mode and Collaboration. YOLO completes every Active and Under Review session and turns Backlog sessions into Backlog items; switching back revives the sessions it closed. Before a switch to YOLO, list the Active, Under Review and Backlog sessions it closes (`sessions list --status active,under-review,backlog`) and switch only on the member's yes in a later message. A YOLO project's work goes into its one chat, the oldest session not Completed: steer it, or create one when there is none, and never run /kosuke:ship there. A refusal (BRANCH_PROTECTED, TURN_IN_FLIGHT, QUEUED_FILES, BACKLOG_FILES) changed nothing: say it.",
|
|
18714
18722
|
"tags": ["projects"],
|
|
18715
18723
|
"x-kosuke-command": ["projects", "switch-workflow"],
|
|
18716
18724
|
"x-kosuke-sandbox-token": true,
|
|
@@ -20025,7 +20033,7 @@
|
|
|
20025
20033
|
},
|
|
20026
20034
|
"memory": {
|
|
20027
20035
|
"type": "string",
|
|
20028
|
-
"enum": ["
|
|
20036
|
+
"enum": ["general.md"]
|
|
20029
20037
|
},
|
|
20030
20038
|
"integration": {
|
|
20031
20039
|
"not": {}
|
|
@@ -21104,7 +21112,7 @@
|
|
|
21104
21112
|
"/api/sensei/memory": {
|
|
21105
21113
|
"get": {
|
|
21106
21114
|
"operationId": "senseiMemoryGet",
|
|
21107
|
-
"summary": "Read your
|
|
21115
|
+
"summary": "Read your private Memory file, general.md, and its revision.",
|
|
21108
21116
|
"tags": ["sensei"],
|
|
21109
21117
|
"x-kosuke-command": ["sensei", "memory", "get"],
|
|
21110
21118
|
"x-kosuke-sandbox-token": true,
|
|
@@ -21171,7 +21179,7 @@
|
|
|
21171
21179
|
},
|
|
21172
21180
|
"file": {
|
|
21173
21181
|
"type": "string",
|
|
21174
|
-
"enum": ["
|
|
21182
|
+
"enum": ["general.md"]
|
|
21175
21183
|
},
|
|
21176
21184
|
"cardId": {
|
|
21177
21185
|
"description": "The Memory card the member approved to start this Turn.",
|
|
@@ -22006,7 +22014,7 @@
|
|
|
22006
22014
|
"/api/sensei/suggest": {
|
|
22007
22015
|
"post": {
|
|
22008
22016
|
"operationId": "senseiSuggest",
|
|
22009
|
-
"summary": "Put suggestion pills in a message of your Turn's own thread, under your words. A tap on a pill fills the member's reply and sends nothing; a newThread pill is a new topic, and its tap starts a thread of its own with those words. Refused when your Turn stopped.",
|
|
22017
|
+
"summary": "Put suggestion pills in a message of your Turn's own thread, under your words. A tap on a pill fills the member's reply and sends nothing; a newThread pill is a new topic, and its tap starts a thread of its own with those words. Refused when your Turn stopped. Each pill is in the member's words; newThread only for an unrelated topic. It is the last thing your Turn posts: end your Turn after it.",
|
|
22010
22018
|
"tags": ["sensei"],
|
|
22011
22019
|
"x-kosuke-command": ["sensei", "suggest"],
|
|
22012
22020
|
"x-kosuke-sandbox-token": true,
|
|
@@ -22090,7 +22098,7 @@
|
|
|
22090
22098
|
"/api/sensei/teammate-messages": {
|
|
22091
22099
|
"post": {
|
|
22092
22100
|
"operationId": "senseiMessagesSend",
|
|
22093
|
-
"summary": "Send a message to a member's Sensei. Any sender can: you, your Sensei
|
|
22101
|
+
"summary": "Send a message to a member's Sensei. Any sender can: you, your Sensei, a Cron Run, or a session's agent; the sender is read from the credential. Their Sensei shows it on a card that says who sent it, with the action that fits, and they are notified as for any card. Name the project with projectId, and optionally the Chat Session (sessionId) or pull request (pullRequest, with projectId) it is about; a sessionId alone names its project. memberId is required: the id a Member mention carries or `kosuke workspaces members` prints, never a guess between members who share a name. key is a slug such as merge-plan, ticket-<slug> or qa-guide, and text, up to 60,000 characters, is everything the member needs, so it can hold a ticket prompt or a whole Project QA Guide. title, why (one line: why this member), paths (the repository paths it is about) and link (a Kosuke path starting with / or an https URL the card opens) are optional. The same key with new text or a new link updates the open card and raises the revision; the same again writes nothing. Pass ifRevision, the revision an earlier send answered, to be refused with MESSAGE_CHANGED when it moved on. When a member sent it, the recipient's approve, edit, reject or reply comes back to the thread it was sent from. Answers id, revision, updated and the recipient: say who it went to. Keys and text by kind: ticket-<slug of the title>, whose text is \"File the ticket <title> in <project>'s Backlog.\" then the reason and the description; start-<slug>, only for an unassigned or the member's own ticket while nothing of theirs builds or waits on them; delete-<slug> with its evidence; merge-<slug> with the merged text and each task's promptRevision; cron-<slug> with its prompt, crontab and projects; merge-plan with each pull request's number, head SHA and action. Before a ticket message, read the open tasks (`tasks list --include-prompt`): send nothing for work a session already covers, and name the Todo task that covers part of it in text. A 400 VALIDATION_ERROR wrote nothing: fix the fields in details and send again with the same key and memberId. Any other refusal is final: send to nobody else instead. An unknown outcome (a timeout, a 5xx) is never sent again. Pass the body with --body or --body-file.",
|
|
22094
22102
|
"tags": ["sensei"],
|
|
22095
22103
|
"x-kosuke-command": ["sensei", "messages", "send"],
|
|
22096
22104
|
"x-kosuke-sandbox-token": true,
|
|
@@ -22287,7 +22295,7 @@
|
|
|
22287
22295
|
"/api/sensei/thread-move": {
|
|
22288
22296
|
"post": {
|
|
22289
22297
|
"operationId": "senseiThreadMove",
|
|
22290
|
-
"summary": "Move the member’s message that started this Turn’s thread into another of their threads, which it continues. Only Sensei calls it, and only before the Turn has written anything: Kosuke ends this Turn, sends the message into that thread, where it is answered with that thread’s memory, and removes this thread. Write no answer after it.",
|
|
22298
|
+
"summary": "Move the member’s message that started this Turn’s thread into another of their threads, which it continues. Only Sensei calls it, and only before the Turn has written anything: Kosuke ends this Turn, sends the message into that thread, where it is answered with that thread’s memory, and removes this thread. Write no answer after it. Move it when it answers a question you asked in that thread, or is about that thread's work or session.",
|
|
22291
22299
|
"tags": ["sensei"],
|
|
22292
22300
|
"x-kosuke-command": ["sensei", "thread", "move"],
|
|
22293
22301
|
"x-kosuke-sandbox-token": true,
|
|
@@ -22350,7 +22358,7 @@
|
|
|
22350
22358
|
"/api/sensei/thread-split": {
|
|
22351
22359
|
"post": {
|
|
22352
22360
|
"operationId": "senseiThreadSplit",
|
|
22353
|
-
"summary": "Split the member’s message that started this Turn’s thread into one thread per ask. Only Sensei calls it, once per message. The member’s message stays the root of this thread, which does the first ask; each other ask becomes a thread of its own with its own Turn. The reply lists the asks handed off: do not do those here.",
|
|
22361
|
+
"summary": "Split the member’s message that started this Turn’s thread into one thread per ask. Only Sensei calls it, once per message. The member’s message stays the root of this thread, which does the first ask; each other ask becomes a thread of its own with its own Turn. The reply lists the asks handed off: do not do those here. Each ask stands alone: \"Ship A, B and C\" is three asks, the steps of one piece of work are one.",
|
|
22354
22362
|
"tags": ["sensei"],
|
|
22355
22363
|
"x-kosuke-command": ["sensei", "thread", "split"],
|
|
22356
22364
|
"x-kosuke-sandbox-token": true,
|
|
@@ -22911,7 +22919,7 @@
|
|
|
22911
22919
|
"/api/tasks": {
|
|
22912
22920
|
"get": {
|
|
22913
22921
|
"operationId": "tasksAll",
|
|
22914
|
-
"summary": "List tasks across your workspaces. Agent credentials stay in their workspace. includeOpenCount counts Todo and In progress with the same filters, independent of status and cursor.",
|
|
22922
|
+
"summary": "List tasks across your workspaces. Agent credentials stay in their workspace. includeOpenCount counts Todo and In progress with the same filters, independent of status and cursor. Before you file or propose a ticket, read the open ones (--status todo,in_progress --include-prompt, following meta.pagination.nextCursor with --cursor) and judge overlap by meaning, not title words: work another task or session already covers gets no new ticket.",
|
|
22915
22923
|
"tags": ["tasks"],
|
|
22916
22924
|
"x-kosuke-command": ["tasks", "all"],
|
|
22917
22925
|
"x-kosuke-sandbox-token": true,
|
|
@@ -23023,7 +23031,9 @@
|
|
|
23023
23031
|
"name": "includePrompt",
|
|
23024
23032
|
"in": "query",
|
|
23025
23033
|
"required": false,
|
|
23034
|
+
"description": "Adds each task's prompt: a Todo task's description, or its first message after Start, cut at 4,000 characters (promptTruncated). Read `tasks get` for a cut or empty one.",
|
|
23026
23035
|
"schema": {
|
|
23036
|
+
"description": "Adds each task's prompt: a Todo task's description, or its first message after Start, cut at 4,000 characters (promptTruncated). Read `tasks get` for a cut or empty one.",
|
|
23027
23037
|
"type": "boolean"
|
|
23028
23038
|
}
|
|
23029
23039
|
},
|
|
@@ -23199,7 +23209,7 @@
|
|
|
23199
23209
|
},
|
|
23200
23210
|
"post": {
|
|
23201
23211
|
"operationId": "userCronsCreate",
|
|
23202
|
-
"summary": "Create a Personal Cron, enabled, with you as its owner. A Personal Cron belongs to you and no workspace: with Personal Repositories or Apps it runs in its own sandbox; without, in its Sensei Thread. Repository runs use your own Subscriptions; thread runs use your Subscriptions or Kosuke free when you hold none. Kosuke free cannot run a Cron with repositories yet. The crontab is read in the cron's own timezone, and may not fire more often than every 15 minutes. The model is an encoded id such as anthropic:opus__xhigh; repositories require an explicit Model from any released Provider on one of your Subscriptions. Changing to Free while you hold a Subscription, or to a personal Model without one, is refused. Without repositories, null or left out runs on the thread’s model. From your Sensei it is refused with 409 CRON_ALREADY_EXISTS when you have a Personal Cron by that name.",
|
|
23212
|
+
"summary": "Create a Personal Cron, enabled, with you as its owner. A Personal Cron belongs to you and no workspace: with Personal Repositories or Apps it runs in its own sandbox; without, in its Sensei Thread. Repository runs use your own Subscriptions; thread runs use your Subscriptions or Kosuke free when you hold none. Kosuke free cannot run a Cron with repositories yet. The crontab is read in the cron's own timezone, and may not fire more often than every 15 minutes. The model is an encoded id such as anthropic:opus__xhigh; repositories require an explicit Model from any released Provider on one of your Subscriptions. Changing to Free while you hold a Subscription, or to a personal Model without one, is refused. Without repositories, null or left out runs on the thread’s model. From your Sensei it is refused with 409 CRON_ALREADY_EXISTS when you have a Personal Cron by that name: update that one instead. From Sensei, create or change one only when the member asks. To move a workspace Cron here, read it and recreate it with its timezone (its model only when the member's own Subscription runs it); the member deletes the workspace one in the app.",
|
|
23203
23213
|
"tags": ["user"],
|
|
23204
23214
|
"x-kosuke-command": ["user", "crons", "create"],
|
|
23205
23215
|
"x-kosuke-sandbox-token": true,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kosuke-ai/kosuke",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "Kosuke platform CLI. The client customers install to drive app.kosuke.ai from their own machine.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -40,11 +40,12 @@
|
|
|
40
40
|
"vitest": "^4.1.12"
|
|
41
41
|
},
|
|
42
42
|
"kosukeRelease": {
|
|
43
|
-
"sourceCommit": "
|
|
44
|
-
"sourceIdentity": "
|
|
43
|
+
"sourceCommit": "bc66357937d20c3224158d1242666e8bc27b70e7",
|
|
44
|
+
"sourceIdentity": "119a65423855174a560baee6ec929f2ef6cc3cf15fdd1aaedbbe67c20e55c1d6",
|
|
45
45
|
"fragments": [
|
|
46
|
-
"
|
|
47
|
-
"
|
|
46
|
+
"cli-drop-lead-aliases-k3v8pq.json",
|
|
47
|
+
"help-from-guides-r4w8kn.json",
|
|
48
|
+
"memory-general-only-r4t8nz.json"
|
|
48
49
|
]
|
|
49
50
|
}
|
|
50
51
|
}
|