@shipfox/client-projects 3.0.1 → 4.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.
@@ -1,2 +1,2 @@
1
1
  $ shipfox-swc
2
- Successfully compiled: 20 files with swc (446.36ms)
2
+ Successfully compiled: 20 files with swc (386.89ms)
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @shipfox/client-projects
2
2
 
3
+ ## 4.0.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 2e5b718: Adds safe browser persistence and bounded callback deduplication across client flows.
8
+ - Updated dependencies [2e5b718]
9
+ - Updated dependencies [6b4a575]
10
+ - Updated dependencies [20e4feb]
11
+ - Updated dependencies [11b10f7]
12
+ - Updated dependencies [781a45b]
13
+ - @shipfox/client-ui@4.0.0
14
+ - @shipfox/client-agent@4.0.0
15
+ - @shipfox/client-integrations@4.0.0
16
+ - @shipfox/client-shell@4.0.0
17
+ - @shipfox/client-api@4.0.0
18
+ - @shipfox/client-auth@4.0.0
19
+ - @shipfox/client-workflows@4.0.0
20
+
3
21
  ## 3.0.1
4
22
 
5
23
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"model-provider-reminder-banner.d.ts","sourceRoot":"","sources":["../../src/components/model-provider-reminder-banner.tsx"],"names":[],"mappings":"AAeA,wBAAgB,2BAA2B,CAAC,EAAC,WAAW,EAAC,EAAE;IAAC,WAAW,EAAE,MAAM,CAAA;CAAC,sCAsC/E"}
1
+ {"version":3,"file":"model-provider-reminder-banner.d.ts","sourceRoot":"","sources":["../../src/components/model-provider-reminder-banner.tsx"],"names":[],"mappings":"AAcA,wBAAgB,2BAA2B,CAAC,EAAC,WAAW,EAAC,EAAE;IAAC,WAAW,EAAE,MAAM,CAAA;CAAC,sCAsC/E"}
@@ -1,10 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useModelProviderConfigsQuery } from '@shipfox/client-agent';
3
+ import { createTypedBrowserStorage, sessionStorageOrUndefined } from '@shipfox/client-ui';
3
4
  import { Alert, AlertActions, AlertClose, AlertContent, AlertDescription, AlertTitle } from '@shipfox/react-ui/alert';
4
5
  import { Button } from '@shipfox/react-ui/button';
5
6
  import { Link } from '@tanstack/react-router';
6
7
  import { useState } from 'react';
7
- const REMINDER_SESSION_KEY_PREFIX = 'shipfox.modelProviderReminder.dismissed.';
8
8
  export function ModelProviderReminderBanner({ workspaceId }) {
9
9
  const configsQuery = useModelProviderConfigsQuery(workspaceId);
10
10
  const [dismissed, setDismissed] = useState(()=>isReminderDismissed(workspaceId));
@@ -51,23 +51,19 @@ export function ModelProviderReminderBanner({ workspaceId }) {
51
51
  });
52
52
  }
53
53
  function isReminderDismissed(workspaceId) {
54
- if (typeof window === 'undefined') return false;
55
- try {
56
- return window.sessionStorage.getItem(sessionKey(workspaceId)) === 'true';
57
- } catch {
58
- return false;
59
- }
54
+ return reminderStorage(workspaceId).read() === true;
60
55
  }
61
56
  function dismissReminder(workspaceId) {
62
- if (typeof window === 'undefined') return;
63
- try {
64
- window.sessionStorage.setItem(sessionKey(workspaceId), 'true');
65
- } catch {
66
- // Session persistence is best-effort; showing the banner again is benign.
67
- }
57
+ reminderStorage(workspaceId).write(true);
68
58
  }
69
- function sessionKey(workspaceId) {
70
- return `${REMINDER_SESSION_KEY_PREFIX}${workspaceId}`;
59
+ function reminderStorage(workspaceId) {
60
+ return createTypedBrowserStorage(sessionStorageOrUndefined, {
61
+ key: `shipfox.modelProviderReminder.dismissed.${workspaceId}`,
62
+ lifetime: 'session',
63
+ principalScope: 'workspace',
64
+ serialize: (dismissed)=>JSON.stringify(dismissed),
65
+ parse: (raw)=>raw === 'true'
66
+ });
71
67
  }
72
68
 
73
69
  //# sourceMappingURL=model-provider-reminder-banner.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/model-provider-reminder-banner.tsx"],"sourcesContent":["import {useModelProviderConfigsQuery} from '@shipfox/client-agent';\nimport {\n Alert,\n AlertActions,\n AlertClose,\n AlertContent,\n AlertDescription,\n AlertTitle,\n} from '@shipfox/react-ui/alert';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Link} from '@tanstack/react-router';\nimport {useState} from 'react';\n\nconst REMINDER_SESSION_KEY_PREFIX = 'shipfox.modelProviderReminder.dismissed.';\n\nexport function ModelProviderReminderBanner({workspaceId}: {workspaceId: string}) {\n const configsQuery = useModelProviderConfigsQuery(workspaceId);\n const [dismissed, setDismissed] = useState(() => isReminderDismissed(workspaceId));\n const configs = configsQuery.data?.configs;\n const unconfigured =\n Array.isArray(configs) &&\n configs.length === 0 &&\n configsQuery.data?.default_provider_id === null;\n\n if (!unconfigured || dismissed) return null;\n\n return (\n <Alert\n variant=\"info\"\n animated={false}\n onOpenChange={(open) => {\n if (!open) {\n dismissReminder(workspaceId);\n setDismissed(true);\n }\n }}\n >\n <AlertContent className=\"pr-28\">\n <AlertTitle>Finish setting up a model provider</AlertTitle>\n <AlertDescription>\n Add workspace credentials, or keep using the instance default.\n </AlertDescription>\n <AlertActions>\n <Button asChild size=\"sm\" variant=\"secondary\">\n <Link to=\"/workspaces/$wid/settings/agents\" params={{wid: workspaceId}}>\n Agents\n </Link>\n </Button>\n </AlertActions>\n </AlertContent>\n <AlertClose />\n </Alert>\n );\n}\n\nfunction isReminderDismissed(workspaceId: string): boolean {\n if (typeof window === 'undefined') return false;\n\n try {\n return window.sessionStorage.getItem(sessionKey(workspaceId)) === 'true';\n } catch {\n return false;\n }\n}\n\nfunction dismissReminder(workspaceId: string): void {\n if (typeof window === 'undefined') return;\n\n try {\n window.sessionStorage.setItem(sessionKey(workspaceId), 'true');\n } catch {\n // Session persistence is best-effort; showing the banner again is benign.\n }\n}\n\nfunction sessionKey(workspaceId: string): string {\n return `${REMINDER_SESSION_KEY_PREFIX}${workspaceId}`;\n}\n"],"names":["useModelProviderConfigsQuery","Alert","AlertActions","AlertClose","AlertContent","AlertDescription","AlertTitle","Button","Link","useState","REMINDER_SESSION_KEY_PREFIX","ModelProviderReminderBanner","workspaceId","configsQuery","dismissed","setDismissed","isReminderDismissed","configs","data","unconfigured","Array","isArray","length","default_provider_id","variant","animated","onOpenChange","open","dismissReminder","className","asChild","size","to","params","wid","window","sessionStorage","getItem","sessionKey","setItem"],"mappings":";AAAA,SAAQA,4BAA4B,QAAO,wBAAwB;AACnE,SACEC,KAAK,EACLC,YAAY,EACZC,UAAU,EACVC,YAAY,EACZC,gBAAgB,EAChBC,UAAU,QACL,0BAA0B;AACjC,SAAQC,MAAM,QAAO,2BAA2B;AAChD,SAAQC,IAAI,QAAO,yBAAyB;AAC5C,SAAQC,QAAQ,QAAO,QAAQ;AAE/B,MAAMC,8BAA8B;AAEpC,OAAO,SAASC,4BAA4B,EAACC,WAAW,EAAwB;IAC9E,MAAMC,eAAeb,6BAA6BY;IAClD,MAAM,CAACE,WAAWC,aAAa,GAAGN,SAAS,IAAMO,oBAAoBJ;IACrE,MAAMK,UAAUJ,aAAaK,IAAI,EAAED;IACnC,MAAME,eACJC,MAAMC,OAAO,CAACJ,YACdA,QAAQK,MAAM,KAAK,KACnBT,aAAaK,IAAI,EAAEK,wBAAwB;IAE7C,IAAI,CAACJ,gBAAgBL,WAAW,OAAO;IAEvC,qBACE,MAACb;QACCuB,SAAQ;QACRC,UAAU;QACVC,cAAc,CAACC;YACb,IAAI,CAACA,MAAM;gBACTC,gBAAgBhB;gBAChBG,aAAa;YACf;QACF;;0BAEA,MAACX;gBAAayB,WAAU;;kCACtB,KAACvB;kCAAW;;kCACZ,KAACD;kCAAiB;;kCAGlB,KAACH;kCACC,cAAA,KAACK;4BAAOuB,OAAO;4BAACC,MAAK;4BAAKP,SAAQ;sCAChC,cAAA,KAAChB;gCAAKwB,IAAG;gCAAmCC,QAAQ;oCAACC,KAAKtB;gCAAW;0CAAG;;;;;;0BAM9E,KAACT;;;AAGP;AAEA,SAASa,oBAAoBJ,WAAmB;IAC9C,IAAI,OAAOuB,WAAW,aAAa,OAAO;IAE1C,IAAI;QACF,OAAOA,OAAOC,cAAc,CAACC,OAAO,CAACC,WAAW1B,kBAAkB;IACpE,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEA,SAASgB,gBAAgBhB,WAAmB;IAC1C,IAAI,OAAOuB,WAAW,aAAa;IAEnC,IAAI;QACFA,OAAOC,cAAc,CAACG,OAAO,CAACD,WAAW1B,cAAc;IACzD,EAAE,OAAM;IACN,0EAA0E;IAC5E;AACF;AAEA,SAAS0B,WAAW1B,WAAmB;IACrC,OAAO,GAAGF,8BAA8BE,aAAa;AACvD"}
1
+ {"version":3,"sources":["../../src/components/model-provider-reminder-banner.tsx"],"sourcesContent":["import {useModelProviderConfigsQuery} from '@shipfox/client-agent';\nimport {createTypedBrowserStorage, sessionStorageOrUndefined} from '@shipfox/client-ui';\nimport {\n Alert,\n AlertActions,\n AlertClose,\n AlertContent,\n AlertDescription,\n AlertTitle,\n} from '@shipfox/react-ui/alert';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Link} from '@tanstack/react-router';\nimport {useState} from 'react';\n\nexport function ModelProviderReminderBanner({workspaceId}: {workspaceId: string}) {\n const configsQuery = useModelProviderConfigsQuery(workspaceId);\n const [dismissed, setDismissed] = useState(() => isReminderDismissed(workspaceId));\n const configs = configsQuery.data?.configs;\n const unconfigured =\n Array.isArray(configs) &&\n configs.length === 0 &&\n configsQuery.data?.default_provider_id === null;\n\n if (!unconfigured || dismissed) return null;\n\n return (\n <Alert\n variant=\"info\"\n animated={false}\n onOpenChange={(open) => {\n if (!open) {\n dismissReminder(workspaceId);\n setDismissed(true);\n }\n }}\n >\n <AlertContent className=\"pr-28\">\n <AlertTitle>Finish setting up a model provider</AlertTitle>\n <AlertDescription>\n Add workspace credentials, or keep using the instance default.\n </AlertDescription>\n <AlertActions>\n <Button asChild size=\"sm\" variant=\"secondary\">\n <Link to=\"/workspaces/$wid/settings/agents\" params={{wid: workspaceId}}>\n Agents\n </Link>\n </Button>\n </AlertActions>\n </AlertContent>\n <AlertClose />\n </Alert>\n );\n}\n\nfunction isReminderDismissed(workspaceId: string): boolean {\n return reminderStorage(workspaceId).read() === true;\n}\n\nfunction dismissReminder(workspaceId: string): void {\n reminderStorage(workspaceId).write(true);\n}\n\nfunction reminderStorage(workspaceId: string) {\n return createTypedBrowserStorage(sessionStorageOrUndefined, {\n key: `shipfox.modelProviderReminder.dismissed.${workspaceId}`,\n lifetime: 'session' as const,\n principalScope: 'workspace' as const,\n serialize: (dismissed: boolean) => JSON.stringify(dismissed),\n parse: (raw: string) => raw === 'true',\n });\n}\n"],"names":["useModelProviderConfigsQuery","createTypedBrowserStorage","sessionStorageOrUndefined","Alert","AlertActions","AlertClose","AlertContent","AlertDescription","AlertTitle","Button","Link","useState","ModelProviderReminderBanner","workspaceId","configsQuery","dismissed","setDismissed","isReminderDismissed","configs","data","unconfigured","Array","isArray","length","default_provider_id","variant","animated","onOpenChange","open","dismissReminder","className","asChild","size","to","params","wid","reminderStorage","read","write","key","lifetime","principalScope","serialize","JSON","stringify","parse","raw"],"mappings":";AAAA,SAAQA,4BAA4B,QAAO,wBAAwB;AACnE,SAAQC,yBAAyB,EAAEC,yBAAyB,QAAO,qBAAqB;AACxF,SACEC,KAAK,EACLC,YAAY,EACZC,UAAU,EACVC,YAAY,EACZC,gBAAgB,EAChBC,UAAU,QACL,0BAA0B;AACjC,SAAQC,MAAM,QAAO,2BAA2B;AAChD,SAAQC,IAAI,QAAO,yBAAyB;AAC5C,SAAQC,QAAQ,QAAO,QAAQ;AAE/B,OAAO,SAASC,4BAA4B,EAACC,WAAW,EAAwB;IAC9E,MAAMC,eAAed,6BAA6Ba;IAClD,MAAM,CAACE,WAAWC,aAAa,GAAGL,SAAS,IAAMM,oBAAoBJ;IACrE,MAAMK,UAAUJ,aAAaK,IAAI,EAAED;IACnC,MAAME,eACJC,MAAMC,OAAO,CAACJ,YACdA,QAAQK,MAAM,KAAK,KACnBT,aAAaK,IAAI,EAAEK,wBAAwB;IAE7C,IAAI,CAACJ,gBAAgBL,WAAW,OAAO;IAEvC,qBACE,MAACZ;QACCsB,SAAQ;QACRC,UAAU;QACVC,cAAc,CAACC;YACb,IAAI,CAACA,MAAM;gBACTC,gBAAgBhB;gBAChBG,aAAa;YACf;QACF;;0BAEA,MAACV;gBAAawB,WAAU;;kCACtB,KAACtB;kCAAW;;kCACZ,KAACD;kCAAiB;;kCAGlB,KAACH;kCACC,cAAA,KAACK;4BAAOsB,OAAO;4BAACC,MAAK;4BAAKP,SAAQ;sCAChC,cAAA,KAACf;gCAAKuB,IAAG;gCAAmCC,QAAQ;oCAACC,KAAKtB;gCAAW;0CAAG;;;;;;0BAM9E,KAACR;;;AAGP;AAEA,SAASY,oBAAoBJ,WAAmB;IAC9C,OAAOuB,gBAAgBvB,aAAawB,IAAI,OAAO;AACjD;AAEA,SAASR,gBAAgBhB,WAAmB;IAC1CuB,gBAAgBvB,aAAayB,KAAK,CAAC;AACrC;AAEA,SAASF,gBAAgBvB,WAAmB;IAC1C,OAAOZ,0BAA0BC,2BAA2B;QAC1DqC,KAAK,CAAC,wCAAwC,EAAE1B,aAAa;QAC7D2B,UAAU;QACVC,gBAAgB;QAChBC,WAAW,CAAC3B,YAAuB4B,KAAKC,SAAS,CAAC7B;QAClD8B,OAAO,CAACC,MAAgBA,QAAQ;IAClC;AACF"}