@kosuke-ai/cli 5.15.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,7 +13,8 @@ kosuke sessions create <projectId> --title "Fix the login form" \
13
13
  --content "See the screenshot" --status backlog --attach shot.png
14
14
  kosuke crons create <workspaceId> --project <projectId> --project <projectId> \
15
15
  --name "Daily ingest" --prompt "/sources" \
16
- --cron-expression "0 6 * * *" --timezone Europe/Zurich
16
+ --cron-expression "0 6 * * *"
17
+ kosuke workspaces timezone-set <workspaceId> --timezone Europe/Zurich
17
18
  ```
18
19
 
19
20
  Every API command prints the platform's JSON response as is, so it pipes into `jq`.
@@ -64,6 +65,15 @@ so on stderr and exits 1.
64
65
  This command is written by hand: the stream is a WebSocket, which the OpenAPI
65
66
  document below cannot describe.
66
67
 
68
+ ## Upgrading from 5.x
69
+
70
+ A cron no longer has a timezone of its own: every cron of a workspace is read
71
+ in the Workspace Timezone, which `kosuke workspaces timezone-set <workspaceId>
72
+ --timezone Europe/Zurich` sets, as an owner or admin. `crons create` and `crons
73
+ update` lose `--timezone`, and the API refuses a cron body that still sends one,
74
+ which is what an older CLI does with `--timezone`. `crons get` still prints the
75
+ cron's `timezone`, the workspace's.
76
+
67
77
  ## Upgrading from 4.x
68
78
 
69
79
  A cron now belongs to its workspace and covers one or more projects, so every
@@ -5,7 +5,7 @@ export const operation = {
5
5
  "crons",
6
6
  "create"
7
7
  ],
8
- "summary": "Create a cron, enabled, with you as its creator, in one or more of the workspace's projects: each fire runs the Cron Agent in every one of them at once. Every run spends the workspace's Credentials, never a member's Subscription, so a workspace with no usable provider is refused. The model is an encoded id such as anthropic:opus__xhigh; null or left out uses the saved Workspace Default Model when its Provider has usable workspace Credentials, otherwise Kosuke's choice among usable workspace Credentials at run time. The crontab may not fire more often than every 15 minutes.",
8
+ "summary": "Create a cron, enabled, with you as its creator, in one or more of the workspace's projects: each fire runs the Cron Agent in every one of them at once. Every run spends the workspace's Credentials, never a member's Subscription, so a workspace with no usable provider is refused. The model is an encoded id such as anthropic:opus__xhigh; null or left out uses the saved Workspace Default Model when its Provider has usable workspace Credentials, otherwise Kosuke's choice among usable workspace Credentials at run time. The crontab is read in the Workspace Timezone (workspaces timezone-set), and may not fire more often than every 15 minutes. A body that sends timezone is refused.",
9
9
  "pathParams": [
10
10
  "workspaceId"
11
11
  ],
@@ -38,14 +38,7 @@ export const operation = {
38
38
  "flag": "cron-expression",
39
39
  "kind": "string",
40
40
  "required": true,
41
- "description": "Five fields: minute, hour, day of month, month, day of week. At most one fire every 15 minutes."
42
- },
43
- {
44
- "name": "timezone",
45
- "flag": "timezone",
46
- "kind": "string",
47
- "required": true,
48
- "description": "The IANA zone the crontab is read in, e.g. Europe/Zurich or UTC."
41
+ "description": "Five fields: minute, hour, day of month, month, day of week, read in the Workspace Timezone (kosuke workspaces timezone-set). At most one fire every 15 minutes."
49
42
  },
50
43
  {
51
44
  "name": "model",
@@ -39,14 +39,7 @@ export const operation = {
39
39
  "flag": "cron-expression",
40
40
  "kind": "string",
41
41
  "required": false,
42
- "description": "Five fields: minute, hour, day of month, month, day of week. At most one fire every 15 minutes."
43
- },
44
- {
45
- "name": "timezone",
46
- "flag": "timezone",
47
- "kind": "string",
48
- "required": false,
49
- "description": "The IANA zone the crontab is read in, e.g. Europe/Zurich or UTC."
42
+ "description": "Five fields: minute, hour, day of month, month, day of week, read in the Workspace Timezone (kosuke workspaces timezone-set). At most one fire every 15 minutes."
50
43
  },
51
44
  {
52
45
  "name": "model",
@@ -141,30 +141,32 @@ import { operation as o139 } from './workspaces/credits.js';
141
141
  import { operation as o140 } from './workspaces/get.js';
142
142
  import { operation as o141 } from './workspaces/getting-started-get.js';
143
143
  import { operation as o142 } from './workspaces/getting-started-update.js';
144
- import { operation as o143 } from './workspaces/integrations-sentry-get.js';
145
- import { operation as o144 } from './workspaces/integrations-sentry-remove.js';
146
- import { operation as o145 } from './workspaces/integrations-slack-get.js';
147
- import { operation as o146 } from './workspaces/lead-cards.js';
148
- import { operation as o147 } from './workspaces/lead-merge.js';
149
- import { operation as o148 } from './workspaces/lead-notifications-open.js';
150
- import { operation as o149 } from './workspaces/lead-proposals-create.js';
151
- import { operation as o150 } from './workspaces/lead-triage.js';
152
- import { operation as o151 } from './workspaces/list.js';
153
- import { operation as o152 } from './workspaces/members.js';
154
- import { operation as o153 } from './workspaces/plugins-list.js';
155
- import { operation as o154 } from './workspaces/plugins-update.js';
156
- import { operation as o155 } from './workspaces/provider-login-claude-complete.js';
157
- import { operation as o156 } from './workspaces/provider-login-claude-start.js';
158
- import { operation as o157 } from './workspaces/provider-login-codex-complete.js';
159
- import { operation as o158 } from './workspaces/provider-login-codex-start.js';
160
- import { operation as o159 } from './workspaces/sandbox-limit.js';
161
- import { operation as o160 } from './workspaces/skills-create.js';
162
- import { operation as o161 } from './workspaces/skills-delete.js';
163
- import { operation as o162 } from './workspaces/skills-get.js';
164
- import { operation as o163 } from './workspaces/skills-list.js';
165
- import { operation as o164 } from './workspaces/skills-update.js';
166
- import { operation as o165 } from './workspaces/stop-sandboxes.js';
167
- import { operation as o166 } from './workspaces/usage.js';
144
+ import { operation as o143 } from './workspaces/integrations-get.js';
145
+ import { operation as o144 } from './workspaces/integrations-list.js';
146
+ import { operation as o145 } from './workspaces/integrations-remove.js';
147
+ import { operation as o146 } from './workspaces/integrations-slack-get.js';
148
+ import { operation as o147 } from './workspaces/lead-cards.js';
149
+ import { operation as o148 } from './workspaces/lead-merge.js';
150
+ import { operation as o149 } from './workspaces/lead-notifications-open.js';
151
+ import { operation as o150 } from './workspaces/lead-proposals-create.js';
152
+ import { operation as o151 } from './workspaces/lead-triage.js';
153
+ import { operation as o152 } from './workspaces/list.js';
154
+ import { operation as o153 } from './workspaces/members.js';
155
+ import { operation as o154 } from './workspaces/plugins-list.js';
156
+ import { operation as o155 } from './workspaces/plugins-update.js';
157
+ import { operation as o156 } from './workspaces/provider-login-claude-complete.js';
158
+ import { operation as o157 } from './workspaces/provider-login-claude-start.js';
159
+ import { operation as o158 } from './workspaces/provider-login-codex-complete.js';
160
+ import { operation as o159 } from './workspaces/provider-login-codex-start.js';
161
+ import { operation as o160 } from './workspaces/sandbox-limit.js';
162
+ import { operation as o161 } from './workspaces/skills-create.js';
163
+ import { operation as o162 } from './workspaces/skills-delete.js';
164
+ import { operation as o163 } from './workspaces/skills-get.js';
165
+ import { operation as o164 } from './workspaces/skills-list.js';
166
+ import { operation as o165 } from './workspaces/skills-update.js';
167
+ import { operation as o166 } from './workspaces/stop-sandboxes.js';
168
+ import { operation as o167 } from './workspaces/timezone-set.js';
169
+ import { operation as o168 } from './workspaces/usage.js';
168
170
  export const operations = [
169
171
  o0,
170
172
  o1,
@@ -333,4 +335,6 @@ export const operations = [
333
335
  o164,
334
336
  o165,
335
337
  o166,
338
+ o167,
339
+ o168,
336
340
  ];
@@ -5,7 +5,7 @@ export const operation = {
5
5
  "workspaces",
6
6
  "get"
7
7
  ],
8
- "summary": "Read one workspace and your role in it.",
8
+ "summary": "Read one workspace, your role in it, and its timezone, the one every cron is read in.",
9
9
  "pathParams": [
10
10
  "workspaceId"
11
11
  ],
@@ -0,0 +1,23 @@
1
+ export const operation = {
2
+ "method": "get",
3
+ "path": "/api/organizations/{workspaceId}/integrations/{toolkit}",
4
+ "command": [
5
+ "workspaces",
6
+ "integrations",
7
+ "get"
8
+ ],
9
+ "summary": "Read one workspace integration by toolkit slug, such as sentry: status, the tenant it is confined to, whether agents may make changes, requested scopes, who authorized it and whether remote cleanup is pending. Never a credential or a connected-account identifier. A toolkit the workspace never connected and this deployment does not offer is a 404.",
10
+ "pathParams": [
11
+ "workspaceId",
12
+ "toolkit"
13
+ ],
14
+ "query": [],
15
+ "body": null,
16
+ "multipart": null,
17
+ "attachments": false,
18
+ "anonymous": false,
19
+ "sandboxToken": true,
20
+ "orchestratorToken": true,
21
+ "cronToken": true,
22
+ "leadToken": true
23
+ };
@@ -1,13 +1,12 @@
1
1
  export const operation = {
2
2
  "method": "get",
3
- "path": "/api/organizations/{workspaceId}/integrations/sentry",
3
+ "path": "/api/organizations/{workspaceId}/integrations",
4
4
  "command": [
5
5
  "workspaces",
6
6
  "integrations",
7
- "sentry",
8
- "get"
7
+ "list"
9
8
  ],
10
- "summary": "Read the workspace Sentry integration: status, organization, requested scopes, who authorized it and whether remote cleanup is pending. Never a credential or a connected-account identifier.",
9
+ "summary": "List the workspace's integrations with their status: every toolkit this deployment offers and every one the workspace still holds. Never a credential or a connected-account identifier.",
11
10
  "pathParams": [
12
11
  "workspaceId"
13
12
  ],
@@ -0,0 +1,23 @@
1
+ export const operation = {
2
+ "method": "delete",
3
+ "path": "/api/organizations/{workspaceId}/integrations/{toolkit}",
4
+ "command": [
5
+ "workspaces",
6
+ "integrations",
7
+ "remove"
8
+ ],
9
+ "summary": "Disconnect an integration by toolkit slug: agents lose the workspace's access at once, then Kosuke deletes the stored authorization, retrying in the background if needed. Revoking the authorization at the toolkit itself is not part of this. Admins only.",
10
+ "pathParams": [
11
+ "workspaceId",
12
+ "toolkit"
13
+ ],
14
+ "query": [],
15
+ "body": null,
16
+ "multipart": null,
17
+ "attachments": false,
18
+ "anonymous": false,
19
+ "sandboxToken": false,
20
+ "orchestratorToken": false,
21
+ "cronToken": false,
22
+ "leadToken": false
23
+ };
@@ -6,7 +6,7 @@ export const operation = {
6
6
  "lead-proposals",
7
7
  "create"
8
8
  ],
9
- "summary": "Open a Lead Card in a member's Needs you that proposes one thing, with one line of why: your own, or from a Cron Run the Needs you of the member memberId names. kind start proposes starting a Backlog session, and is refused unless that member is idle. kind delete_ticket (with evidence), merge_tickets (with sessionIds, mergedContent and the promptRevision sessions get gave for each ticket in revisions) and create_cron (with name, prompt, crontab, timezone and projectIds, and no sessionId) change nothing until the member accepts the card. Pass the body whole with --body or --body-file.",
9
+ "summary": "Open a Lead Card in a member's Needs you that proposes one thing, with one line of why: your own, or from a Cron Run the Needs you of the member memberId names. kind start proposes starting a Backlog session, and is refused unless that member is idle. kind delete_ticket (with evidence), merge_tickets (with sessionIds, mergedContent and the promptRevision sessions get gave for each ticket in revisions) and create_cron (with name, prompt, crontab, read in the Workspace Timezone, and projectIds, and no sessionId) change nothing until the member accepts the card. Pass the body whole with --body or --body-file.",
10
10
  "pathParams": [
11
11
  "workspaceId"
12
12
  ],
@@ -0,0 +1,32 @@
1
+ export const operation = {
2
+ "method": "put",
3
+ "path": "/api/organizations/{workspaceId}/timezone",
4
+ "command": [
5
+ "workspaces",
6
+ "timezone-set"
7
+ ],
8
+ "summary": "Set the Workspace Timezone, the IANA zone every cron of the workspace is read and shown in, e.g. Europe/Rome. Each enabled cron's next run moves to the new zone, except one already due, which fires on its slot. Refused, naming the crons, when any cron would fire more often than every 15 minutes or never in the new zone; nothing changes then. Sending the zone already set changes nothing. Owners and admins only.",
9
+ "pathParams": [
10
+ "workspaceId"
11
+ ],
12
+ "query": [],
13
+ "body": {
14
+ "fields": [
15
+ {
16
+ "name": "timezone",
17
+ "flag": "timezone",
18
+ "kind": "string",
19
+ "required": true,
20
+ "description": "The IANA zone every cron of the workspace is read and shown in, e.g. Europe/Rome or UTC."
21
+ }
22
+ ],
23
+ "required": true
24
+ },
25
+ "multipart": null,
26
+ "attachments": false,
27
+ "anonymous": false,
28
+ "sandboxToken": true,
29
+ "orchestratorToken": true,
30
+ "cronToken": true,
31
+ "leadToken": true
32
+ };
package/openapi.json CHANGED
@@ -591,7 +591,7 @@
591
591
  "/api/organizations/{workspaceId}": {
592
592
  "get": {
593
593
  "operationId": "workspacesGet",
594
- "summary": "Read one workspace and your role in it.",
594
+ "summary": "Read one workspace, your role in it, and its timezone, the one every cron is read in.",
595
595
  "tags": ["workspaces"],
596
596
  "x-kosuke-command": ["workspaces", "get"],
597
597
  "x-kosuke-sandbox-token": true,
@@ -1463,7 +1463,7 @@
1463
1463
  },
1464
1464
  "post": {
1465
1465
  "operationId": "cronsCreate",
1466
- "summary": "Create a cron, enabled, with you as its creator, in one or more of the workspace's projects: each fire runs the Cron Agent in every one of them at once. Every run spends the workspace's Credentials, never a member's Subscription, so a workspace with no usable provider is refused. The model is an encoded id such as anthropic:opus__xhigh; null or left out uses the saved Workspace Default Model when its Provider has usable workspace Credentials, otherwise Kosuke's choice among usable workspace Credentials at run time. The crontab may not fire more often than every 15 minutes.",
1466
+ "summary": "Create a cron, enabled, with you as its creator, in one or more of the workspace's projects: each fire runs the Cron Agent in every one of them at once. Every run spends the workspace's Credentials, never a member's Subscription, so a workspace with no usable provider is refused. The model is an encoded id such as anthropic:opus__xhigh; null or left out uses the saved Workspace Default Model when its Provider has usable workspace Credentials, otherwise Kosuke's choice among usable workspace Credentials at run time. The crontab is read in the Workspace Timezone (workspaces timezone-set), and may not fire more often than every 15 minutes. A body that sends timezone is refused.",
1467
1467
  "tags": ["crons"],
1468
1468
  "x-kosuke-command": ["crons", "create"],
1469
1469
  "x-kosuke-sandbox-token": true,
@@ -1513,13 +1513,7 @@
1513
1513
  "type": "string",
1514
1514
  "minLength": 1,
1515
1515
  "maxLength": 100,
1516
- "description": "Five fields: minute, hour, day of month, month, day of week. At most one fire every 15 minutes."
1517
- },
1518
- "timezone": {
1519
- "type": "string",
1520
- "minLength": 1,
1521
- "maxLength": 64,
1522
- "description": "The IANA zone the crontab is read in, e.g. Europe/Zurich or UTC."
1516
+ "description": "Five fields: minute, hour, day of month, month, day of week, read in the Workspace Timezone (kosuke workspaces timezone-set). At most one fire every 15 minutes."
1523
1517
  },
1524
1518
  "model": {
1525
1519
  "description": "An encoded model id such as anthropic:opus__xhigh. Null, or left out on create, uses the Workspace Default Model at run time, then Kosuke's choice among available workspace Credentials.",
@@ -1534,7 +1528,7 @@
1534
1528
  ]
1535
1529
  }
1536
1530
  },
1537
- "required": ["name", "projectIds", "prompt", "cronExpression", "timezone"]
1531
+ "required": ["name", "projectIds", "prompt", "cronExpression"]
1538
1532
  }
1539
1533
  }
1540
1534
  }
@@ -1699,13 +1693,7 @@
1699
1693
  "type": "string",
1700
1694
  "minLength": 1,
1701
1695
  "maxLength": 100,
1702
- "description": "Five fields: minute, hour, day of month, month, day of week. At most one fire every 15 minutes."
1703
- },
1704
- "timezone": {
1705
- "type": "string",
1706
- "minLength": 1,
1707
- "maxLength": 64,
1708
- "description": "The IANA zone the crontab is read in, e.g. Europe/Zurich or UTC."
1696
+ "description": "Five fields: minute, hour, day of month, month, day of week, read in the Workspace Timezone (kosuke workspaces timezone-set). At most one fire every 15 minutes."
1709
1697
  },
1710
1698
  "model": {
1711
1699
  "description": "An encoded model id such as anthropic:opus__xhigh. Null, or left out on create, uses the Workspace Default Model at run time, then Kosuke's choice among available workspace Credentials.",
@@ -2803,12 +2791,67 @@
2803
2791
  }
2804
2792
  }
2805
2793
  },
2806
- "/api/organizations/{workspaceId}/integrations/sentry": {
2794
+ "/api/organizations/{workspaceId}/integrations": {
2795
+ "get": {
2796
+ "operationId": "workspacesIntegrationsList",
2797
+ "summary": "List the workspace's integrations with their status: every toolkit this deployment offers and every one the workspace still holds. Never a credential or a connected-account identifier.",
2798
+ "tags": ["workspaces"],
2799
+ "x-kosuke-command": ["workspaces", "integrations", "list"],
2800
+ "x-kosuke-sandbox-token": true,
2801
+ "x-kosuke-orchestrator-token": true,
2802
+ "x-kosuke-cron-token": true,
2803
+ "x-kosuke-lead-token": true,
2804
+ "parameters": [
2805
+ {
2806
+ "name": "workspaceId",
2807
+ "in": "path",
2808
+ "required": true,
2809
+ "schema": {
2810
+ "type": "string",
2811
+ "minLength": 1
2812
+ }
2813
+ }
2814
+ ],
2815
+ "responses": {
2816
+ "2XX": {
2817
+ "description": "Success envelope",
2818
+ "content": {
2819
+ "application/json": {
2820
+ "schema": {
2821
+ "$ref": "#/components/schemas/ApiSuccess"
2822
+ }
2823
+ }
2824
+ }
2825
+ },
2826
+ "4XX": {
2827
+ "description": "Error envelope",
2828
+ "content": {
2829
+ "application/json": {
2830
+ "schema": {
2831
+ "$ref": "#/components/schemas/ApiError"
2832
+ }
2833
+ }
2834
+ }
2835
+ },
2836
+ "5XX": {
2837
+ "description": "Error envelope",
2838
+ "content": {
2839
+ "application/json": {
2840
+ "schema": {
2841
+ "$ref": "#/components/schemas/ApiError"
2842
+ }
2843
+ }
2844
+ }
2845
+ }
2846
+ }
2847
+ }
2848
+ },
2849
+ "/api/organizations/{workspaceId}/integrations/{toolkit}": {
2807
2850
  "get": {
2808
- "operationId": "workspacesIntegrationsSentryGet",
2809
- "summary": "Read the workspace Sentry integration: status, organization, requested scopes, who authorized it and whether remote cleanup is pending. Never a credential or a connected-account identifier.",
2851
+ "operationId": "workspacesIntegrationsGet",
2852
+ "summary": "Read one workspace integration by toolkit slug, such as sentry: status, the tenant it is confined to, whether agents may make changes, requested scopes, who authorized it and whether remote cleanup is pending. Never a credential or a connected-account identifier. A toolkit the workspace never connected and this deployment does not offer is a 404.",
2810
2853
  "tags": ["workspaces"],
2811
- "x-kosuke-command": ["workspaces", "integrations", "sentry", "get"],
2854
+ "x-kosuke-command": ["workspaces", "integrations", "get"],
2812
2855
  "x-kosuke-sandbox-token": true,
2813
2856
  "x-kosuke-orchestrator-token": true,
2814
2857
  "x-kosuke-cron-token": true,
@@ -2822,6 +2865,15 @@
2822
2865
  "type": "string",
2823
2866
  "minLength": 1
2824
2867
  }
2868
+ },
2869
+ {
2870
+ "name": "toolkit",
2871
+ "in": "path",
2872
+ "required": true,
2873
+ "schema": {
2874
+ "type": "string",
2875
+ "minLength": 1
2876
+ }
2825
2877
  }
2826
2878
  ],
2827
2879
  "responses": {
@@ -2858,10 +2910,10 @@
2858
2910
  }
2859
2911
  },
2860
2912
  "delete": {
2861
- "operationId": "workspacesIntegrationsSentryRemove",
2862
- "summary": "Disconnect Sentry: agents lose the workspace's access at once, then Kosuke deletes the stored authorization, retrying in the background if needed. Revoking the authorization inside Sentry is not part of this. Admins only.",
2913
+ "operationId": "workspacesIntegrationsRemove",
2914
+ "summary": "Disconnect an integration by toolkit slug: agents lose the workspace's access at once, then Kosuke deletes the stored authorization, retrying in the background if needed. Revoking the authorization at the toolkit itself is not part of this. Admins only.",
2863
2915
  "tags": ["workspaces"],
2864
- "x-kosuke-command": ["workspaces", "integrations", "sentry", "remove"],
2916
+ "x-kosuke-command": ["workspaces", "integrations", "remove"],
2865
2917
  "parameters": [
2866
2918
  {
2867
2919
  "name": "workspaceId",
@@ -2871,6 +2923,15 @@
2871
2923
  "type": "string",
2872
2924
  "minLength": 1
2873
2925
  }
2926
+ },
2927
+ {
2928
+ "name": "toolkit",
2929
+ "in": "path",
2930
+ "required": true,
2931
+ "schema": {
2932
+ "type": "string",
2933
+ "minLength": 1
2934
+ }
2874
2935
  }
2875
2936
  ],
2876
2937
  "responses": {
@@ -3156,7 +3217,7 @@
3156
3217
  "/api/organizations/{workspaceId}/lead/proposals": {
3157
3218
  "post": {
3158
3219
  "operationId": "workspacesLeadProposalsCreate",
3159
- "summary": "Open a Lead Card in a member's Needs you that proposes one thing, with one line of why: your own, or from a Cron Run the Needs you of the member memberId names. kind start proposes starting a Backlog session, and is refused unless that member is idle. kind delete_ticket (with evidence), merge_tickets (with sessionIds, mergedContent and the promptRevision sessions get gave for each ticket in revisions) and create_cron (with name, prompt, crontab, timezone and projectIds, and no sessionId) change nothing until the member accepts the card. Pass the body whole with --body or --body-file.",
3220
+ "summary": "Open a Lead Card in a member's Needs you that proposes one thing, with one line of why: your own, or from a Cron Run the Needs you of the member memberId names. kind start proposes starting a Backlog session, and is refused unless that member is idle. kind delete_ticket (with evidence), merge_tickets (with sessionIds, mergedContent and the promptRevision sessions get gave for each ticket in revisions) and create_cron (with name, prompt, crontab, read in the Workspace Timezone, and projectIds, and no sessionId) change nothing until the member accepts the card. Pass the body whole with --body or --body-file.",
3160
3221
  "tags": ["workspaces"],
3161
3222
  "x-kosuke-command": ["workspaces", "lead-proposals", "create"],
3162
3223
  "x-kosuke-sandbox-token": true,
@@ -3361,13 +3422,7 @@
3361
3422
  "type": "string",
3362
3423
  "minLength": 1,
3363
3424
  "maxLength": 100,
3364
- "description": "Five fields: minute, hour, day of month, month, day of week. At most one fire every 15 minutes."
3365
- },
3366
- "timezone": {
3367
- "type": "string",
3368
- "minLength": 1,
3369
- "maxLength": 64,
3370
- "description": "The IANA zone the crontab is read in, e.g. Europe/Zurich or UTC."
3425
+ "description": "Five fields: minute, hour, day of month, month, day of week, read in the Workspace Timezone (kosuke workspaces timezone-set). At most one fire every 15 minutes."
3371
3426
  },
3372
3427
  "projectIds": {
3373
3428
  "minItems": 1,
@@ -3387,7 +3442,6 @@
3387
3442
  "name",
3388
3443
  "prompt",
3389
3444
  "crontab",
3390
- "timezone",
3391
3445
  "projectIds"
3392
3446
  ]
3393
3447
  }
@@ -4533,6 +4587,80 @@
4533
4587
  }
4534
4588
  }
4535
4589
  },
4590
+ "/api/organizations/{workspaceId}/timezone": {
4591
+ "put": {
4592
+ "operationId": "workspacesTimezoneSet",
4593
+ "summary": "Set the Workspace Timezone, the IANA zone every cron of the workspace is read and shown in, e.g. Europe/Rome. Each enabled cron's next run moves to the new zone, except one already due, which fires on its slot. Refused, naming the crons, when any cron would fire more often than every 15 minutes or never in the new zone; nothing changes then. Sending the zone already set changes nothing. Owners and admins only.",
4594
+ "tags": ["workspaces"],
4595
+ "x-kosuke-command": ["workspaces", "timezone-set"],
4596
+ "x-kosuke-sandbox-token": true,
4597
+ "x-kosuke-orchestrator-token": true,
4598
+ "x-kosuke-cron-token": true,
4599
+ "x-kosuke-lead-token": true,
4600
+ "parameters": [
4601
+ {
4602
+ "name": "workspaceId",
4603
+ "in": "path",
4604
+ "required": true,
4605
+ "schema": {
4606
+ "type": "string",
4607
+ "minLength": 1
4608
+ }
4609
+ }
4610
+ ],
4611
+ "requestBody": {
4612
+ "required": true,
4613
+ "content": {
4614
+ "application/json": {
4615
+ "schema": {
4616
+ "type": "object",
4617
+ "properties": {
4618
+ "timezone": {
4619
+ "type": "string",
4620
+ "minLength": 1,
4621
+ "maxLength": 64,
4622
+ "description": "The IANA zone every cron of the workspace is read and shown in, e.g. Europe/Rome or UTC."
4623
+ }
4624
+ },
4625
+ "required": ["timezone"]
4626
+ }
4627
+ }
4628
+ }
4629
+ },
4630
+ "responses": {
4631
+ "2XX": {
4632
+ "description": "Success envelope",
4633
+ "content": {
4634
+ "application/json": {
4635
+ "schema": {
4636
+ "$ref": "#/components/schemas/ApiSuccess"
4637
+ }
4638
+ }
4639
+ }
4640
+ },
4641
+ "4XX": {
4642
+ "description": "Error envelope",
4643
+ "content": {
4644
+ "application/json": {
4645
+ "schema": {
4646
+ "$ref": "#/components/schemas/ApiError"
4647
+ }
4648
+ }
4649
+ }
4650
+ },
4651
+ "5XX": {
4652
+ "description": "Error envelope",
4653
+ "content": {
4654
+ "application/json": {
4655
+ "schema": {
4656
+ "$ref": "#/components/schemas/ApiError"
4657
+ }
4658
+ }
4659
+ }
4660
+ }
4661
+ }
4662
+ }
4663
+ },
4536
4664
  "/api/organizations/{workspaceId}/usage": {
4537
4665
  "get": {
4538
4666
  "operationId": "workspacesUsage",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kosuke-ai/cli",
3
- "version": "5.15.0",
3
+ "version": "6.0.0",
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": {
@@ -1,23 +0,0 @@
1
- export const operation = {
2
- "method": "delete",
3
- "path": "/api/organizations/{workspaceId}/integrations/sentry",
4
- "command": [
5
- "workspaces",
6
- "integrations",
7
- "sentry",
8
- "remove"
9
- ],
10
- "summary": "Disconnect Sentry: agents lose the workspace's access at once, then Kosuke deletes the stored authorization, retrying in the background if needed. Revoking the authorization inside Sentry is not part of this. Admins only.",
11
- "pathParams": [
12
- "workspaceId"
13
- ],
14
- "query": [],
15
- "body": null,
16
- "multipart": null,
17
- "attachments": false,
18
- "anonymous": false,
19
- "sandboxToken": false,
20
- "orchestratorToken": false,
21
- "cronToken": false,
22
- "leadToken": false
23
- };