@kosuke-ai/kosuke 1.0.31 → 1.0.33

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 CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.33
4
+
5
+ - `user profile get` no longer returns `replyStyle` or `plainLanguage`: the Agent replies preference is gone, and Sensei now fits its explanations to the member by itself.
6
+ - `kosuke projects merge-agent get` takes `--live false` to read Kosuke's own data only, without waiting for GitHub: each waiting pull request's head and review decision and the merge queue are then null.
7
+ - `kosuke sensei cards set` says a reply's text is written without the Sign as Sensei marker, which Kosuke adds at send when the member has it on.
8
+
9
+ ## 1.0.32
10
+
11
+ - `kosuke sensei cards set --sign-in` names the site, Chrome profile ID, Mac and wall URL of a sign-in card on the member's Mac, so its Approve allows exactly one tapped `kosuke mac browser login`. A card keyed `mac-sign-in:` without it is refused.
12
+ - A `messages` block row on a Sensei card can name its `connection` and `conversation`, so the member can open that conversation on the FYI messages card and read its unread messages there.
13
+ - Cron Runs on Claude, Codex and Meta models run as root in their own sandbox, as a coding session does, so builds that write tool settings under the home (such as Wrangler's) and commits in their clones work. Grok and Gemini Cron Runs keep their own user.
14
+
3
15
  ## 1.0.31
4
16
 
5
17
  - `kosuke sensei tickets merge` and `kosuke sensei messages move` are no longer offered to session sandbox or Cron agents: only you and your Sensei run them.
@@ -6,7 +6,7 @@ export const operation = {
6
6
  "browser",
7
7
  "login"
8
8
  ],
9
- "summary": "Get a site signed in in this Sensei Thread's browser from the member's everyday Chrome: pass the browser call's profile and deviceId, and the site as a bare hostname (twitter.com is x.com; Google's sites are refused). --reuse picks up the sign-in that profile in their Chrome holds by itself, with no tap: once per site and profile in a Turn, with the profile's exact ID. It never opens Chrome or waits for anyone, and answers opened false and signedIn false with chrome none (their Chrome holds no sign-in for the site, so nothing changed), same (the one this thread's browser already holds) or different (taken into this thread's browser, taken true). Then, unless it answered none or same, open the site with browser and check the account. On SIGN_IN_NEEDS_TAP or UPDATE_REQUIRED, put the sign-in card. A --reuse spends no tap, so it gives no card back. Every tapped mode (`sign-in`, `take`, `waitNew`) needs the member's tap on the sign-in card in this thread; `--forget` and `--reuse` need none. A sign-in takes the sign-in that profile in their Chrome holds when it differs from this thread's, without opening anything, and answers taken true, opened false and signedIn false, since the site has not confirmed it; or else it opens --url, or the site's page, in their Chrome and waits up to 8 minutes for the member to sign in. On LinkedIn and X it answers signedIn true and opened true. On any other site a change of the site's cookies is taken and answered taken true and signedIn false, since a change is not a sign-in, and an end with no change answers taken false; a desktop app too old to watch the site opens it and answers at once, with no taken. Every answer with taken true carries waitNewLeft: while it is above 0 and the site is still signed out, --wait-new (with the same --url), in the same Turn and with no new tap, waits for a newer sign-in, never taking the one taken already, and opens the site only when this Turn has not; once the tap's time has run out it fails with SIGN_IN_WINDOW_ENDED, and no card comes back. After the member's I'm signed in tap, --take takes that site's cookies, never Google's, and answers taken. --forget removes a sign-in this Turn took, a --reuse's included, for an account other than the one expected, and needs no tap. Each tap allows one call: a call without one, or a --wait-new that no take armed, fails with SIGN_IN_NEEDS_TAP. Then open the site with browser and check the account before account-specific work. On DEVICE_OFFLINE, TIMEOUT, SIGN_IN_TIMEOUT and KEYCHAIN_UNAVAILABLE Kosuke gives the member's card back by itself. Fails with SIGN_IN_TIMEOUT when Kosuke saw no new sign-in to LinkedIn or X within 8 minutes, PROFILE_DISCONNECTED for a profile turned off in Settings → Devices, KEYCHAIN_UNAVAILABLE when macOS did not let Kosuke read Chrome's sign-ins, STALE_TURN when the Turn stopped, and UPDATE_REQUIRED on a desktop app too old for it. Only Sensei calls it.",
9
+ "summary": "Get a site signed in in this Sensei Thread's browser from the member's everyday Chrome: pass the browser call's profile and deviceId, and the site as a bare hostname (twitter.com is x.com; Google's sites are refused). --reuse picks up the sign-in that profile in their Chrome holds by itself, with no tap: once per site and profile in a Turn, with the profile's exact ID. It never opens Chrome or waits for anyone, and answers opened false and signedIn false with chrome none (their Chrome holds no sign-in for the site, so nothing changed), same (the one this thread's browser already holds) or different (taken into this thread's browser, taken true). Then, unless it answered none or same, open the site with browser and check the account. On SIGN_IN_NEEDS_TAP or UPDATE_REQUIRED, put the sign-in card: `kosuke sensei cards set` with --sign-in naming this site, profile and deviceId. A --reuse spends no tap, so it gives no card back. Every tapped mode (`sign-in`, `take`, `waitNew`) needs the member's tap on the sign-in card in this thread; `--forget` and `--reuse` need none. A sign-in takes the sign-in that profile in their Chrome holds when it differs from this thread's, without opening anything, and answers taken true, opened false and signedIn false, since the site has not confirmed it; or else it opens --url, or the site's page, in their Chrome and waits up to 8 minutes for the member to sign in. On LinkedIn and X it answers signedIn true and opened true. On any other site a change of the site's cookies is taken and answered taken true and signedIn false, since a change is not a sign-in, and an end with no change answers taken false; a desktop app too old to watch the site opens it and answers at once, with no taken. Every answer with taken true carries waitNewLeft: while it is above 0 and the site is still signed out, --wait-new (with the same --url), in the same Turn and with no new tap, waits for a newer sign-in, never taking the one taken already, and opens the site only when this Turn has not; once the tap's time has run out it fails with SIGN_IN_WINDOW_ENDED, and no card comes back. After the member's I'm signed in tap, --take takes that site's cookies, never Google's, and answers taken. --forget removes a sign-in this Turn took, a --reuse's included, for an account other than the one expected, and needs no tap. Each tap allows one call: a call without one, or a --wait-new that no take armed, fails with SIGN_IN_NEEDS_TAP. Then open the site with browser and check the account before account-specific work. On DEVICE_OFFLINE, TIMEOUT, SIGN_IN_TIMEOUT and KEYCHAIN_UNAVAILABLE Kosuke gives the member's card back by itself. Fails with SIGN_IN_TIMEOUT when Kosuke saw no new sign-in to LinkedIn or X within 8 minutes, PROFILE_DISCONNECTED for a profile turned off in Settings → Devices, KEYCHAIN_UNAVAILABLE when macOS did not let Kosuke read Chrome's sign-ins, STALE_TURN when the Turn stopped, and UPDATE_REQUIRED on a desktop app too old for it. Only Sensei calls it.",
10
10
  "pathParams": [],
11
11
  "query": [],
12
12
  "body": {
@@ -6,11 +6,22 @@ export const operation = {
6
6
  "merge-agent",
7
7
  "get"
8
8
  ],
9
- "summary": "Read the project's Merge agent: its mode (train or batch), the base and whether it has GitHub's merge queue, the go-ahead pull requests waiting with their QA and GitHub's review decision now, and the open run and earlier runs.",
9
+ "summary": "Read the project's Merge agent: its mode (train or batch), the base and whether it has GitHub's merge queue, the go-ahead pull requests waiting with their QA and GitHub's review decision now, and the open run and earlier runs. --live false reads Kosuke's own data only: no GitHub call, and GitHub's facts (each pull request's head and review decision, the merge queue) are null.",
10
10
  "pathParams": [
11
11
  "projectId"
12
12
  ],
13
- "query": [],
13
+ "query": [
14
+ {
15
+ "name": "live",
16
+ "flag": "live",
17
+ "kind": "string",
18
+ "required": false,
19
+ "choices": [
20
+ "true",
21
+ "false"
22
+ ]
23
+ }
24
+ ],
14
25
  "body": null,
15
26
  "multipart": null,
16
27
  "attachments": false,
@@ -138,6 +138,13 @@ export const operation = {
138
138
  "kind": "json",
139
139
  "required": false
140
140
  },
141
+ {
142
+ "name": "signIn",
143
+ "flag": "sign-in",
144
+ "kind": "json",
145
+ "required": false,
146
+ "description": "A sign-in card on the member's Mac: the site, the Chrome profile ID, the Mac and, on the Sign in card of a site other than LinkedIn and X, the wall's url. Its Approve allows one tapped `kosuke mac browser login` for exactly these. Key it mac-sign-in:<site>:<profile> (the profile ID lowercase, spaces as hyphens: Profile 6 is profile-6) for Sign in, with :done for I'm signed in and :account for Continue as, both of which run --take. Only a card keyed mac-sign-in: takes it, and such a card needs it. A Sign in card for LinkedIn or X marks that connection signed out."
147
+ },
141
148
  {
142
149
  "name": "covers",
143
150
  "flag": "covers",
@@ -6,7 +6,7 @@ export const operation = {
6
6
  "profile",
7
7
  "get"
8
8
  ],
9
- "summary": "Read your account: id, email, name, onboarding state, default model, Reply Style and FYI digest interval.",
9
+ "summary": "Read your account: id, email, name, onboarding state, default model and FYI digest interval.",
10
10
  "pathParams": [],
11
11
  "query": [],
12
12
  "body": null,
package/openapi.json CHANGED
@@ -1561,7 +1561,7 @@
1561
1561
  "/api/devices/mac/browser-sign-in": {
1562
1562
  "post": {
1563
1563
  "operationId": "macBrowserLogin",
1564
- "summary": "Get a site signed in in this Sensei Thread's browser from the member's everyday Chrome: pass the browser call's profile and deviceId, and the site as a bare hostname (twitter.com is x.com; Google's sites are refused). --reuse picks up the sign-in that profile in their Chrome holds by itself, with no tap: once per site and profile in a Turn, with the profile's exact ID. It never opens Chrome or waits for anyone, and answers opened false and signedIn false with chrome none (their Chrome holds no sign-in for the site, so nothing changed), same (the one this thread's browser already holds) or different (taken into this thread's browser, taken true). Then, unless it answered none or same, open the site with browser and check the account. On SIGN_IN_NEEDS_TAP or UPDATE_REQUIRED, put the sign-in card. A --reuse spends no tap, so it gives no card back. Every tapped mode (`sign-in`, `take`, `waitNew`) needs the member's tap on the sign-in card in this thread; `--forget` and `--reuse` need none. A sign-in takes the sign-in that profile in their Chrome holds when it differs from this thread's, without opening anything, and answers taken true, opened false and signedIn false, since the site has not confirmed it; or else it opens --url, or the site's page, in their Chrome and waits up to 8 minutes for the member to sign in. On LinkedIn and X it answers signedIn true and opened true. On any other site a change of the site's cookies is taken and answered taken true and signedIn false, since a change is not a sign-in, and an end with no change answers taken false; a desktop app too old to watch the site opens it and answers at once, with no taken. Every answer with taken true carries waitNewLeft: while it is above 0 and the site is still signed out, --wait-new (with the same --url), in the same Turn and with no new tap, waits for a newer sign-in, never taking the one taken already, and opens the site only when this Turn has not; once the tap's time has run out it fails with SIGN_IN_WINDOW_ENDED, and no card comes back. After the member's I'm signed in tap, --take takes that site's cookies, never Google's, and answers taken. --forget removes a sign-in this Turn took, a --reuse's included, for an account other than the one expected, and needs no tap. Each tap allows one call: a call without one, or a --wait-new that no take armed, fails with SIGN_IN_NEEDS_TAP. Then open the site with browser and check the account before account-specific work. On DEVICE_OFFLINE, TIMEOUT, SIGN_IN_TIMEOUT and KEYCHAIN_UNAVAILABLE Kosuke gives the member's card back by itself. Fails with SIGN_IN_TIMEOUT when Kosuke saw no new sign-in to LinkedIn or X within 8 minutes, PROFILE_DISCONNECTED for a profile turned off in Settings → Devices, KEYCHAIN_UNAVAILABLE when macOS did not let Kosuke read Chrome's sign-ins, STALE_TURN when the Turn stopped, and UPDATE_REQUIRED on a desktop app too old for it. Only Sensei calls it.",
1564
+ "summary": "Get a site signed in in this Sensei Thread's browser from the member's everyday Chrome: pass the browser call's profile and deviceId, and the site as a bare hostname (twitter.com is x.com; Google's sites are refused). --reuse picks up the sign-in that profile in their Chrome holds by itself, with no tap: once per site and profile in a Turn, with the profile's exact ID. It never opens Chrome or waits for anyone, and answers opened false and signedIn false with chrome none (their Chrome holds no sign-in for the site, so nothing changed), same (the one this thread's browser already holds) or different (taken into this thread's browser, taken true). Then, unless it answered none or same, open the site with browser and check the account. On SIGN_IN_NEEDS_TAP or UPDATE_REQUIRED, put the sign-in card: `kosuke sensei cards set` with --sign-in naming this site, profile and deviceId. A --reuse spends no tap, so it gives no card back. Every tapped mode (`sign-in`, `take`, `waitNew`) needs the member's tap on the sign-in card in this thread; `--forget` and `--reuse` need none. A sign-in takes the sign-in that profile in their Chrome holds when it differs from this thread's, without opening anything, and answers taken true, opened false and signedIn false, since the site has not confirmed it; or else it opens --url, or the site's page, in their Chrome and waits up to 8 minutes for the member to sign in. On LinkedIn and X it answers signedIn true and opened true. On any other site a change of the site's cookies is taken and answered taken true and signedIn false, since a change is not a sign-in, and an end with no change answers taken false; a desktop app too old to watch the site opens it and answers at once, with no taken. Every answer with taken true carries waitNewLeft: while it is above 0 and the site is still signed out, --wait-new (with the same --url), in the same Turn and with no new tap, waits for a newer sign-in, never taking the one taken already, and opens the site only when this Turn has not; once the tap's time has run out it fails with SIGN_IN_WINDOW_ENDED, and no card comes back. After the member's I'm signed in tap, --take takes that site's cookies, never Google's, and answers taken. --forget removes a sign-in this Turn took, a --reuse's included, for an account other than the one expected, and needs no tap. Each tap allows one call: a call without one, or a --wait-new that no take armed, fails with SIGN_IN_NEEDS_TAP. Then open the site with browser and check the account before account-specific work. On DEVICE_OFFLINE, TIMEOUT, SIGN_IN_TIMEOUT and KEYCHAIN_UNAVAILABLE Kosuke gives the member's card back by itself. Fails with SIGN_IN_TIMEOUT when Kosuke saw no new sign-in to LinkedIn or X within 8 minutes, PROFILE_DISCONNECTED for a profile turned off in Settings → Devices, KEYCHAIN_UNAVAILABLE when macOS did not let Kosuke read Chrome's sign-ins, STALE_TURN when the Turn stopped, and UPDATE_REQUIRED on a desktop app too old for it. Only Sensei calls it.",
1565
1565
  "tags": ["mac"],
1566
1566
  "x-kosuke-command": ["mac", "browser", "login"],
1567
1567
  "x-kosuke-answer-timeout-ms": 590000,
@@ -17046,7 +17046,7 @@
17046
17046
  "/api/projects/{projectId}/merge-agent": {
17047
17047
  "get": {
17048
17048
  "operationId": "projectsMergeAgentGet",
17049
- "summary": "Read the project's Merge agent: its mode (train or batch), the base and whether it has GitHub's merge queue, the go-ahead pull requests waiting with their QA and GitHub's review decision now, and the open run and earlier runs.",
17049
+ "summary": "Read the project's Merge agent: its mode (train or batch), the base and whether it has GitHub's merge queue, the go-ahead pull requests waiting with their QA and GitHub's review decision now, and the open run and earlier runs. --live false reads Kosuke's own data only: no GitHub call, and GitHub's facts (each pull request's head and review decision, the merge queue) are null.",
17050
17050
  "tags": ["projects"],
17051
17051
  "x-kosuke-command": ["projects", "merge-agent", "get"],
17052
17052
  "x-kosuke-sandbox-token": true,
@@ -17062,6 +17062,15 @@
17062
17062
  "format": "uuid",
17063
17063
  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
17064
17064
  }
17065
+ },
17066
+ {
17067
+ "name": "live",
17068
+ "in": "query",
17069
+ "required": false,
17070
+ "schema": {
17071
+ "type": "string",
17072
+ "enum": ["true", "false"]
17073
+ }
17065
17074
  }
17066
17075
  ],
17067
17076
  "responses": {
@@ -21104,6 +21113,16 @@
21104
21113
  "link": {
21105
21114
  "type": "string",
21106
21115
  "maxLength": 2000
21116
+ },
21117
+ "connection": {
21118
+ "type": "string",
21119
+ "format": "uuid",
21120
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
21121
+ },
21122
+ "conversation": {
21123
+ "type": "string",
21124
+ "minLength": 1,
21125
+ "maxLength": 512
21107
21126
  }
21108
21127
  },
21109
21128
  "required": ["network", "sender", "subject", "count", "at"]
@@ -21858,7 +21877,8 @@
21858
21877
  "text": {
21859
21878
  "type": "string",
21860
21879
  "minLength": 1,
21861
- "maxLength": 4000
21880
+ "maxLength": 4000,
21881
+ "description": "The reply as written, without the Sign as Sensei marker: Kosuke adds it at send when the member has it on."
21862
21882
  }
21863
21883
  },
21864
21884
  "required": ["type", "connection", "conversation", "messageId", "text"],
@@ -21909,6 +21929,38 @@
21909
21929
  }
21910
21930
  ]
21911
21931
  },
21932
+ "signIn": {
21933
+ "description": "A sign-in card on the member's Mac: the site, the Chrome profile ID, the Mac and, on the Sign in card of a site other than LinkedIn and X, the wall's url. Its Approve allows one tapped `kosuke mac browser login` for exactly these. Key it mac-sign-in:<site>:<profile> (the profile ID lowercase, spaces as hyphens: Profile 6 is profile-6) for Sign in, with :done for I'm signed in and :account for Continue as, both of which run --take. Only a card keyed mac-sign-in: takes it, and such a card needs it. A Sign in card for LinkedIn or X marks that connection signed out.",
21934
+ "type": "object",
21935
+ "properties": {
21936
+ "site": {
21937
+ "type": "string",
21938
+ "pattern": "^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,63}$",
21939
+ "description": "The site, as a bare hostname such as linkedin.com. twitter.com is x.com."
21940
+ },
21941
+ "profile": {
21942
+ "type": "string",
21943
+ "minLength": 1,
21944
+ "maxLength": 255,
21945
+ "pattern": "^[^`\\u0000-\\u001f\\u007f]+$",
21946
+ "description": "The Chrome profile directory ID from `kosuke mac browser profiles list`, such as \"Profile 6\", exactly as the browser call names it."
21947
+ },
21948
+ "deviceId": {
21949
+ "type": "string",
21950
+ "format": "uuid",
21951
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
21952
+ "description": "The Mac, by the ID `kosuke mac browser profiles list` returns with the profile."
21953
+ },
21954
+ "url": {
21955
+ "description": "Only on the Sign in card of a site other than LinkedIn and X: the https page on that site that showed the sign-in wall, which the call opens in the member’s Chrome.",
21956
+ "type": "string",
21957
+ "maxLength": 2048,
21958
+ "format": "uri"
21959
+ }
21960
+ },
21961
+ "required": ["site", "profile", "deviceId"],
21962
+ "additionalProperties": false
21963
+ },
21912
21964
  "covers": {
21913
21965
  "description": "The ids of the incoming_message events of this thread that this card answers: a reply covers the message it answers, a task or calendar card the message in its evidence, an FYI the event of every row. An FYI update keeps unread commitments and the events in its current evidence, discarding processed history; name at most 50 events per write. The open FYI keeps a reference to every message it has covered, which its Mark read marks, and its card read gives their count and the newest.",
21914
21966
  "minItems": 1,
@@ -26650,7 +26702,7 @@
26650
26702
  "/api/user/profile": {
26651
26703
  "get": {
26652
26704
  "operationId": "userProfileGet",
26653
- "summary": "Read your account: id, email, name, onboarding state, default model, Reply Style and FYI digest interval.",
26705
+ "summary": "Read your account: id, email, name, onboarding state, default model and FYI digest interval.",
26654
26706
  "tags": ["user"],
26655
26707
  "x-kosuke-command": ["user", "profile", "get"],
26656
26708
  "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.31",
3
+ "version": "1.0.33",
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,10 +40,12 @@
40
40
  "vitest": "^4.1.12"
41
41
  },
42
42
  "kosukeRelease": {
43
- "sourceCommit": "bd9029c68466df2c6c91c2a72e081cbb42d58ad8",
44
- "sourceIdentity": "d07d5e2696d17ece82fe762e770cbde753caf3454e506d1b53cf82c37571ab16",
43
+ "sourceCommit": "8034f374ac00927174a1a52fa0b5c3958539f2cf",
44
+ "sourceIdentity": "32f854131338b85afbc2556bb9b76262a69450a67c97984e9449e6838215239e",
45
45
  "fragments": [
46
- "sensei-card-commands-sensei-only.json"
46
+ "remove-reply-style-0fdhwb.json",
47
+ "merge-agent-live-paoigd.json",
48
+ "sign-as-sensei-reply-text.json"
47
49
  ]
48
50
  }
49
51
  }